4
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);

然后,程序将崩溃。我知道这可能看起来很奇怪,但我正在学习并想知道其中的区别。

4

1 回答 1

9

是因为演员阵容。这条线说:

int *a =(int*) {1,2,3};

将数组{1,2,3}视为指向 int 的指针。在 32 位机器上,指针的值为 now 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
于 2012-04-19T01:38:49.997 回答