【发布时间】:2020-04-24 07:29:12
【问题描述】:
为什么是 f.e. int arrayp[]和int* arrayp一样,作为函数定义/声明中的参数?
int* foo(int arrayp[]){}
指向 int 数组的第一个元素的指针作为参数传递给调用者。
喜欢:
#include <stdio.h>
int* foo (int arrayp[]);
int main(void)
{
int a[] = { 10,5,4,2,1 };
int *p;
p = foo(a);
printf("%d",*p);
return 0;
}
int* foo(int arrayp[])
{
*arrayp = 0;
return arrayp;
}
为什么int arrayp[] 是指向int 类型数组的第一个元素的指针?恕我直言,我认为这非常令人困惑。有些人可能认为他们用这个表达式传递了一个完整的数组(按值传递)。
【问题讨论】:
-
您对“为什么?”的回应是什么?真的没什么好讨论的。您证明您已经理解它是 not 按值传递的,所以您真的想问“我如何按值传递数组”?
-
@PatrickRoberts 当然有“为什么”的答案。它们只是在 C 标准中找不到。
-
@PatrickRoberts:当然是有原因的,也有一些事情要讨论。当 C 刚被开发时,数组是一件大事,即使它只有几个元素,并且通过值(会占用太多堆栈和/或寄存器空间)或透明传递它会很笨拙参考(如果需要,安排编译器进行复制,并通过对程序员隐藏的参考传递)。当时,简单明了的解决方案是按地址传递数组,并且为了方便程序员,为此提供自动转换和调整。
标签: c arrays pointers parameter-passing pass-by-reference