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)
然后,程序将崩溃.我知道这可能看起来很奇怪,但我正在研究并希望了解其中的差异.
这是因为演员.这条线说:
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)