C 函数不能返回数组类型。函数返回类型可以是“T 数组”或“函数返回 T”以外的任何类型。另请注意,您不能分配数组类型;即,以下代码将不起作用:
int a[10];
a = foo();
C 中的数组与其他类型的处理方式不同;在大多数情况下,数组表达式的类型从“T 的 N 元素数组”隐式转换(“衰减”)到“指向 T 的指针”,并且其值被设置为指向数组中的第一个元素。此规则的例外情况是数组表达式是 sizeof 或地址 (&) 运算符的操作数,或者当表达式是用于在声明中初始化另一个数组的字符串文字时。
鉴于声明
T a[N];
对于任何类型的 T,那么以下是正确的:
表达式类型衰减到注释
---------- ---- --------- -----
a T [N] T * 值是第一个元素的地址
&a T (*)[N] n/a 值是数组的地址(其中
是一样的地址
第一个元素,但类型是
不同的)
sizeof a size_t n/a 数组中的字节数(字符)=
N * sizeof(T)
sizeof a[i] size_t n/a 单个元素的字节数 =
大小(T)
a[i] T n/a 第 i 个元素的值
&a[i] T * n/a 第 i 个元素的地址
由于隐式转换规则,当你将数组参数传递给函数时,函数接收的是指针值,而不是数组值:
int a[10];
...
foo(a);
...
void foo(int *a)
{
// do something with a
}
还要注意做类似的事情
int *foo(void)
{
int arr[N];
...
return arr;
}
不起作用;一旦函数退出,数组arr 在技术上不再存在,并且它的内容可能在你有机会使用它之前被覆盖。
如果您不是动态分配缓冲区,最好的办法是将要修改的数组作为参数传递给函数,以及它们的大小(因为函数只接收一个指针值,它无法判断数组有多大是):
int a[10];
init(a, sizeof a / sizeof a[0]); // divide the total number of bytes in
... // in the array by the number of bytes
void init(int *a, size_t len) // a single element to get the number
{ // of elements
size_t i;
for (i = 0; i < len; i++)
a[i] = i;
}