在C语言中,当我们将数组传递给函数fun()时,fun()始终将其视为指针。下面的示例演示了相同的内容。
C
#include
// Note that arr[] for fun is just a pointer even if square
// brackets are used
void fun(int arr[]) // SAME AS void fun(int *arr)
{
unsigned int n = sizeof(arr)/sizeof(arr[0]);
printf("\nArray size inside fun() is %d", n);
}
// Driver program
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
unsigned int n = sizeof(arr)/sizeof(arr[0]);
printf("Array size inside main() is %d", n);
fun(arr);
return 0;
}
C
#include
void fun(int *arr, unsigned int n)
{
int i;
for (i=0; i
C
#include
void fun(int arr[], unsigned int n)
{
int i;
for (i=0; i
C
#include
void fun(int *arr)
{
int i;
unsigned int n = sizeof(arr)/sizeof(arr[0]);
for (i=0; i
C
#include
#include
void fun(char *arr)
{
int i;
unsigned int n = strlen(arr);
printf("n = %d\n", n);
for (i=0; i
C
#include
#include
void fun(char *arr)
{
int i;
unsigned int n = strlen(arr);
printf("n = %d\n", n);
for (i=0; i
C++
#include
using namespace std;
template
void print(int (&a)[N]){
for(int e: a){
cout << e << endl;
}
}
int main(){
int a[] {1, 2, 3, 4, 5};
print(a);
}
输出:
Array size inside main() is 8
Array size inside fun() is 1
因此,在C语言中,我们必须将array的大小作为参数传递。仅在以’\ 0’结尾的字符数组的情况下,可能不需要大小,可以通过检查字符串字符的末尾来确定大小。
以下是一个简单的示例,以显示通常如何在C中传递数组。
C
#include
void fun(int *arr, unsigned int n)
{
int i;
for (i=0; i
输出:
1 2 3 4 5 6 7 8
锻炼:
预测以下C程序的输出:
1。
C
#include
void fun(int arr[], unsigned int n)
{
int i;
for (i=0; i
2。
C
#include
void fun(int *arr)
{
int i;
unsigned int n = sizeof(arr)/sizeof(arr[0]);
for (i=0; i
3。
C
#include
#include
void fun(char *arr)
{
int i;
unsigned int n = strlen(arr);
printf("n = %d\n", n);
for (i=0; i
4,
C
#include
#include
void fun(char *arr)
{
int i;
unsigned int n = strlen(arr);
printf("n = %d\n", n);
for (i=0; i
请注意,上述程序中的字符数组未以’\ 0’结尾。有关详细信息,请参见此。
现在,这些是我们使用的一些常见方法,但是您知道吗,有一种超酷的方法可以做到这一点,因此您将能够保留阵列的身份。我们稍后将简要讨论。
为此,我们首先需要查看所有上述建议方法的缺点-
缺点:
- 上述方法的主要缺点是编译器不知道要传递的内容。我的意思是,对于编译器,我们只是传递一个int *,并且我们知道这指向数组,但是编译器并不知道这一点。
- 要验证我的声明,您可以在数组上调用for-each循环。您肯定会收到一条错误消息,指出未找到可调用的开始,结束函数。
这是因为传递数组就像实际传递整数指针一样,它本身没有有关基础数组的信息,因此不提供迭代器。
模板方法(引用数组):
此方法保留有关基础数组的所有信息。
该方法主要基于对数组的引用,但是将其与模板一起使用可以优化我们的方法。模板依赖关系实际上是在函数调用时自动计算数组的长度,因此可以使用它来创建引用,因为对数组的引用必须知道数组的大小。
检查我的帖子有关对数组
这里,模板用于推导模板参数。
C++
#include
using namespace std;
template
void print(int (&a)[N]){
for(int e: a){
cout << e << endl;
}
}
int main(){
int a[] {1, 2, 3, 4, 5};
print(a);
}
输出
1
2
3
4
5
在这里,您可以看到为什么需要模板参数推导–为base创建对数组的引用,以便我们可以将数组作为参数。
访问我上面的链接以了解以下信息:
- 双重编译器对数组的看法。
- 引用数组。
- 如何使用参考?
- 数组是类型还是仅指向第一个元素的指针?
- 对于编译器而言,两个不同长度的数组是否相同?
- 数组和指针之间的区别。
由mohdatishanx改进的文章。
相关文章:
- 不要将sizeof用于数组参数。
- C语言中的指针和数组之间的区别?
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。