我今天练习了一些 C 代码,尤其是带有返回函数和指针的数组。 我发现了一些非常令人困惑的代码,我想知道为什么会这样。
所以我首先有一个函数可以打印出数组中的所有元素。
void function(int *arr)
{
...
printf("%d, arr[i]);
}
现在在 main 中我有一个二维数组和一个一维数组。
int array2D[2][2] = {{1,2}, {3,4}};
int array1D[3] = {1,2,3};
function(*array2D); // Why do I need here the derefernce pointer
function(array1D); // why I don't need here the deference pointer
在另一种情况下:
void disp( int *num)
{
printf("%d ", *num);
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
for (int i=0; i<10; i++)
{
/* Passing addresses of array elements*/
disp(&arr[i]); // why i need here & and above in the function not
}
}
这让我现在很困惑。谁能给我解释一下?
最佳答案
第一行
function(*array2D);
相当于
function(array2D[0]);
所以你传递的是第一个数组[1,2]
。在 C 中,数组衰减为指针
当它被传递给一个函数时。
然而,您的函数
函数1也应该得到
数组的元素。
void function(int *arr, size_t len)
{
size_t i;
for(i = 0; i < len; ++i)
printf("%d\n", arr[i]);
}
然后你可以调用它2
int array2D[2][2] = { { 1,2} ,{3,4}};
int array1D[3] = {1,2,3};
function(*array2D, sizeof *array2D / sizeof **array2D);
function(array1D, sizeof array1D / sizeof *array1D);
disp (&arr[i]); // why i need here & and above in the function not
因为 arr[i]
会给你存储在 i
位置的值,disp
需要一个指针,因此您使用 &
运算符返回
i
位置的数组,也等价于arr + i
。
1不要调用你的函数function
。从技术上讲,这是有效的名称,但它
如果你给你的函数更明确的名字会更好,这样就可以了
看名字就知道功能是什么。
2请注意,sizeof array/sizeof *array
仅适用于数组。如果你有一个
函数并且你期望一个数组,你只会得到一个指向数组的指针。
在这种情况下,您还需要传递数组的长度。
关于c - 二维和一维数组中指针的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48290730/