c - 在 C 函数中将指针作为数组传递?

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

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

最佳答案

这是因为 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/

相关文章:

c++ - 如何在 C++ 中返回数据的拷贝

C 系统调用处理程序引用具有不同返回类型和参数数量的函数

c - 递归求数组最小值的方法

c - 为什么我们在 C 中需要枚举数据类型,尽管它比通过一个变量字符串甚至 #define 实现它使用更多的内存

javascript - 绑定(bind)到 Angular 中按钮的索引增量函数不会增加索引,也不会迭代数组

c - C中的指针传递/引用传递

c - Apple Hypervisor在MacOS Big Sur beta 11.0.1上完全损坏

c++ - 多态性:从基类数组访问派生类元素

python - 打印 NumPy 数组时的轴顺序

c++ - 数组遍历与指针,缓存效率方面