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

ipk*_*iss 4 c arrays pointers

void f(int *a, int n)
{
     int i;
     for (i = 0; i < n; i++)
     {
         printf("%d\n", *(a+i));
     }
 }
Run Code Online (Sandbox Code Playgroud)

如果main()我打电话,上面的代码工作正常:

int a[] = {1,2,3};
int *p = a;

f(a, 3);
Run Code Online (Sandbox Code Playgroud)

但如果在main(),我做了:

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

f(a, 3);
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*nes 9

这是因为演员.这条线说:

int *a =(int*) {1,2,3};
Run Code Online (Sandbox Code Playgroud)

将数组{1,2,3}视为指向int的指针.在32位机器上,指针的值现在是1,这不是你想要的.

但是,当你这样做时:

int *p = a;
Run Code Online (Sandbox Code Playgroud)

编译器知道它可以将数组名称衰减为指向它的第一个元素的指针.这就像你实际上写的:

int *p = &(a[0]);
Run Code Online (Sandbox Code Playgroud)

类似地,您可以直接传递a给函数,因为编译器在用作函数参数时也会将数组名称衰减为指针:

int a[] = {1,2,3};
int *p = &(a[0]);

f(p, 3) 
f(a, 3); // these two are equivalent
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,您可以使用以下命令分配`a`:`int*a =(int*)(int []){1,2,3};` (3认同)
  • 您可以.但我不能在良心上推荐它;) (2认同)