将指针作为数组传递给C中的函数?

时间:2012-04-19 01:34:41

标签: c arrays pointers

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

然后,程序将崩溃。我知道这可能看起来很奇怪,但我正在研究并希望了解其中的差异。

1 个答案:

答案 0 :(得分:9)

这是因为演员。这句话说:

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