void f(int *a, int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d\n", *(a+i));
}
}
如果在 main()
中我调用了上面的代码就可以正常工作:
int a[] = {1,2,3};
int *p = a;
f(a, 3);
但是如果在 main()
中,我做了:
int *a =(int*) {1,2,3};
f(a, 3);
然后,程序就会崩溃。我知道这可能看起来很奇怪,但我正在学习并想知道其中的区别。
最佳答案
这是因为 Actor 。这一行说:
int *a =(int*) {1,2,3};
将数组 {1,2,3}
视为指向 int 的指针。在 32 位机器上,指针的值现在是 1
,这不是您想要的。
但是,当您这样做时:
int *p = a;
编译器知道它可以将数组名称衰减为指向它的第一个元素的指针。这就像你真的写了:
int *p = &(a[0]);
同样,您可以直接将 a
传递给函数,因为当用作函数参数时,编译器还会将数组名称衰减为指针:
int a[] = {1,2,3};
int *p = &(a[0]);
f(p, 3)
f(a, 3); // these two are equivalent
关于c - 在 C 函数中将指针作为数组传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10220473/