#include <stdio.h>
void test(int *arr, int n)
{
for(int i = 0; i < n; ++i)
printf("%d ", *(arr + i));
printf("\n");
}
int main(void) {
int a[10] = { 1,2,3,4,5,6,7,8,9,10};
test(a,10);
return 0;
}
这给出了正确的答案,即"1 2 3 4 5 6 7 8 9 10
“,但当我将第一个参数在test
函数中的类型更改为*arr[]
时,它将给出
1 3 5 7 9 0 0 965108401 262144 404875544
看起来i += 2
发生在for
循环中。
修改后的代码如下
#include <stdio.h>
void test(int *arr[], int n)
{
for(int i = 0; i < n; ++i)
printf("%d ", *(arr + i));
printf("\n");
}
int main(void) {
int a[10] = { 1,2,3,4,5,6,7,8,9,10};
test(a,10);
return 0;
}
*arr[]
到底是什么?
发布于 2019-05-21 07:54:15
总的来说,a
被声明为大小为10的int数组。当将它传递给函数时,它很好地衰减到指向其第一个元素的指针,因此在函数中声明它为int *arr
(如果可以的话)。
另一方面,int *arr[]
声明了一个指向int的指针数组(不完整)。它将以int **
的形式处理它不是什么,从而调用未定义的行为。在您的实现中,指针的大小似乎是int的两倍,这就解释了为什么它看起来像函数接收的每一项。但是由于UB的存在,你甚至不能依赖它
要记住的是:对C初学者来说,正确的间接水平可能并不容易,但正确编写C代码是至关重要的。使用适当的/最近的编译器,并注意警告。
发布于 2019-05-21 08:16:18
星号是指向类型的指针。
因此,int[] *
是指向ints数组的指针。也就是说,您有一个指向数组类型/变量的指针。
另一方面,int *
是一个指向int的指针。在int[]
和int *
之间重定向有一种常见的行为,但这并不相同(例如,谷歌搜索结果https://www.quora.com/What-is-the-difference-between-pointer-and-array之一)。
除去int *
和int[]
的差异,*arr[]
是指向数组的指针。因为您可以使用指针机制/算术来使用指针访问数组,所以可以将*arr[]
看作一个二维数组。也就是说,与只有指针的*arr[]
等价的是int**
。
https://stackoverflow.com/questions/56230439
复制相似问题