多数的数组引用都会退化为数组第一元素的指针,就是C语言中数组和指针“等价”的基础。
在C语言中只是指针算术和数组下标运算等价,指针和数组是不同的。
因此,数组在C语言中是个“二等公民”。
事实上,下表表达式 a[i] 就是按照等价的指针表达式 *((a)+(i)) 定义的。
1,函数形参的数组和指针声明可以互换。
例如:void f(char a[]) {} 与 void f(char *a) {}
这是一种便利的做法,由于数组会马上退化为指针,数组事实上从来没有被传入函数。
允许指针参数声明为数组只不过是为了让它看起来好像传入了数组。
2,数组不能被赋值。
例如:char carr [10];
carr = "abc"; //error
3,数组和下标在C语言中可以互换。
在C语言中的字符串就是char型数组,所以表达式“abc”[2]是合法的,值就是字符‘c’。
int main(int argc, char* agrv[])
{
char c = "abc"[2];
printf("\"abc\"[2]=%c\n", c);
return 0;
}
(环境win7 32位 vc6.0)输出:"abc"[2]=c
4,数组和指针
(1)数组和指针的区别
区别在于类型。
在标准C中,&array生成一个“T型数组”的指针,指向整个数组。
在所有的C编译器中,对数组的简单引用(不包括&操作符)生成一个"T型"的指针,指向数组的第一个元素。
例如: int a[10];
对于a的引用的类型是“int型的指针”,而&a是“10个int的数组的指针”。
(2) int (*ap)[3],ap为数组指针,在使用下标或增量操作符的时候,会跳过整个数组。
5,数组的大小
sizeof操作符如果能够判断出数组的大小,它就会返回数组的大小。如果数组的大小未知或者数组已经退化为指针,
则它不能提供数组的大小。
例如:
void f(char arr[])
{
printf("f() arr sizeof:%d\n", sizeof(arr));
}
int main(int argc, char* agrv[])
{
char arr[20];
printf("sizeof(arr):%d\n", sizeof(arr));// 输出20
f(arr); //输出4,arr退化为指针
return 0;
}