当我们将数组作为参数传递时,我们接受它作为指针,即:
func(array);//In main I invoke the function array of type int and size 5
void func(int *arr)
or
void fun(int arr[])//As we know arr[] gets converted int *arr
此处基地址存储在arr
。
但是当以这种方式接受传递的数组时:
void func(int arr[5])//Works fine.
是否为arr [5]分配了内存?
如果是,那会发生什么?
如果不是,为什么不分配内存?
答案 0 :(得分:3)
void func(int *arr)
void func(int arr[])
void func(int arr[5])
在C中都是等效的。
C表示类型数组的参数已调整为类型指针。
答案 1 :(得分:3)
是否为arr [5]分配了内存?
不,它没有。
如果不是,为什么没有分配内存?
因为没有必要。数组传递给函数时,总是衰减成指针。因此,虽然数组不是指针而指针不是数组,但在函数参数中,以下代码段是等效的:
T1 function(T2 *arg);
T1 function(T2 arg[]);
T1 function(T2 arg[N]);
答案 2 :(得分:0)
在参数声明中放置数组大小时,数字将被完全忽略。换句话说
void foo(int x[5]);
与
完全相同void foo(int *x);
答案 3 :(得分:0)
希望以下代码/评论有所帮助。编码C时,程序员必须确保许多项目在各种程序中一致。这既是C语言编程的乐趣,也是编程的祸根。
请注意。在参数列表中定义int arr[5]
不会为正在传递的数据分配存储空间。该声明有效并得到认可,但仅限于它允许编译器执行其类型检查。虽然,编译器确实在调用函数时分配存储,但存储不存储您的数据。您必须通过显式声明(如以下示例中的main)分配数据,或者您需要发出malloc
语句。
我在Eclipse / Microsoft C编译器中运行了以下代码,并且NO语句被标记为警告或错误。
//In main invoke the functions all referring the same array of type int and size 5
void func1(int *arr)
{ // arr is a pointer to an int. The int can be the first element
// of an array or not. The compiler has no way to tell what the truth is.
}
void func2(int arr[])
{ // arr is a pointer to an array of integers, the compiler can check this
// by looking at the caller's code. It was no way to check if the number
// of entries in the array is correct.
}
void func3(int arr[5])
{ // arr is a pointer to an array of 5 integers. The compiler can
// check that it's length is 5, but if you choose to overrun the
// array then the compiler won't stop you. This is why func1 and func2
// will work with arr as a pointer to an array of ints.
}
void main()
{
int data_array[5] = {2,3,5,7,11};
func1(data_array);
func2(data_array);
func3(data_array);
}
希望这有帮助,请询问更多信息。