#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[]
实际上是什么?
答案 0 :(得分:0)
在主函数中,a
被声明为大小为10的int数组。将其传递给函数时,它很好地衰减指向其第一个元素的指针,因此声明如果可以的话,则为int *arr
。
另一方面,int *arr[]
声明了一个(不完整的)指向int的指针数组。它会以int **
的形式在函数中进行处理,而不是进行处理,从而调用未定义的行为。在您的实现中,指针的大小似乎是int的两倍,这解释了为什么它看起来像该函数占用了第二个项目。但是由于有了UB,您甚至不能依靠它
要记住的是:对于C初学者来说,正确的间接级别可能并不容易,但是正确编写C代码至关重要。使用良好的/最新的编译器,并注意警告。
答案 1 :(得分:0)
星号是指向类型的指针。
因此,int[] *
是一个指向整数数组的指针。也就是说,您有一个指向数组类型/变量的指针。
另一方面,int *
是一个指向int的指针。在int[]
和int *
之间重定向时,有一种常见的行为,但这并不相同(例如,第一个Google搜索结果https://www.quora.com/What-is-the-difference-between-pointer-and-array中的一个)
撇开int *
和int[]
的区别,*arr[]
是指向数组的指针。因为您可以使用指针机制/算术来使用指针访问数组,所以可以将*arr[]
视为二维数组。也就是说,仅带有指针的*arr[]
等效于int**
。