数组是“二等公民”
- 数组不能直接赋值
- 作为参数传递会退化为指针
- 不能作为函数返回值
数组不能直接赋值
我们都知道,简单的变量类型,不如int 和 char ,是可以直接赋值的:
int a = 1;
int b = 2;
b =a;//赋值操作
但是如果是数组,int a[3] = {1,2,3}; int b[3] = {0};
是无法操作a = b
的。另外值得说明的是,放在结构体里面的数组是可以随着结构体赋值来进行赋值的:
#include <stdio.h>
struct Foo {
int n;
double d[2];
char *p_c;
}foo1, foo2;
int main()
{
char *c = (char *) malloc (4*sizeof(char));
c[0] = 'a'; c[1] = 'b'; c[2] = 'c'; c[3] = '\0';
foo1.n = 1;
foo1.d[0] = 2; foo1.d[1] = 3;
foo1.p_c = c;
foo2 = foo1; //assign foo1 to foo2
printf("%d %lf %lf %s\n", foo2.n, foo2.d[0], foo2.d[1], foo2.p_c);
return 0;
}
运行结果如下:
1 2.000000 3.000000 abc
以上的代码段中,有结构体的赋值操作 foo2 = foo1;
,确实里面的数组也进行了赋值。
作为参数传递会退化为指针
这个很容易理解,当我们想把数组作为函数参数传递过去的时候,int a[2] = {1,2}; func(a);
在func
的实现里面,形参还必须用指针来接收。我们知道,数组的两要素是,类型和个数,退化为指针也就是丢了个要素-个数。
不能作为函数返回值
函数是不能返回数组类型的,但是结构体却可以。