int main(){//数组初始化
int a[5] = {1, 2};//第 1、2 个元素分别为 1、2,其余为 0 int b[] = {1, 2};//编译过程中,编译会为计算数组 b 的⼤⼩ int i=0;
for (i = 0;i < 4;i++) {
printf(\"a[%d] = %d\\n\",i,a[i]); }
printf(\"sizeof(a) = %d\\n\",sizeof(a)); //20 printf(\"sizeof(b) = %d\\n\",sizeof(b)); //8
printf(\"count for a: %d\\n\",sizeof(a)/sizeof(int)); //5 printf(\"count for b: %d\\n\",sizeof(b)/sizeof(int)); //2 return 0;}
2.数组地址(&a)与数组名 a
(1)数组名 a 代表数组⾸元素的地址。因此,第 2 个元素的地址为 a+1,以此类推……。注 意 a 或 a+i 表⽰元素的地址。可以⽤*(a+i)取出元素的值,也可以⽤ a[i]来取出元素的
值,因为当编译中遇到 a[i]会⾃动转为*(a+i)。反过来也可知,第 1 个元素的地址为 a 或&a[0],第 2 个元素的地址为 a+1 或&a[1],第 i 个元素的地址为(a+i)或&a[i]……
(2)数组的地址需要⽤取地址符&才能得到。即形如&a 取的是整个数组的地址,所以&a+1表⽰指向整个数组的最后⾯的位置。 (3)数组的⾸元素的地址值与数组的地址值相同,但是两个不同的概念。
数组名和数组地址
#include int main(){//将数组每个元素初始化为 0
int a[5] = {0};//含义,将第 1 个元素初始化为 0,其余为 0.
printf(\"a = %p\\n\",a); //⾸元素的地址
printf(\"&a = %p\\n\",&a); //整个数组的地址,从数值上看,与 a ⼀样。 printf(\"&a[0] = %p\\n\",&a[0]);//第 1 个元素的地址 return 0;}
3.数组名的盲点
(1)数组名的内涵在于其指代实体是⼀种数据结构,这种数据结构就是数组。如 int a[5]表⽰ a 的类型为 int[5],所以 sizeof(a)表⽰取整个数组的⼤⼩,&a 表⽰数组的地址。
(2)数组名的外延:除了sizeof(a)和&a外,数组名经常可看作是⼀个常量指针。但要注意这⾥仅仅是“看作”,⽽不是真正的指针。不同于指针,数组名只是编译过程中的⼀个符号,编译器并不为其分配内存,有⼈称之为“伪变量”。因此,形式a++\\a—或a=b(其中b是另⼀个数组名)这些都是错误的,因为a只是⼀个符号,编译器会把数组信息(如⼤⼩,地址)放⼊符号表中,每次遇到数组名a时,就会从符号表中取出这个数组的地址,然后⽤这个固定的地址代替 a,所以这个符号并没有被分配内存空间,⽽上述操作都是针对变量⽽⾔的,故数组名只能做为右值使⽤。
(3)对数组的引⽤,如a[i]或*(a+i),只需访问内存⼀次,⽽指针的引⽤如*(p+i)则需要两次,⾸选通过&p找到p指针,然后加i,再从p+i⾥⾯取出的内容。
(4)当数组名作为形参时,将退化为指针。即可以把数组名当成指针来⽤,这⾥的sizeof(数组名)为4,即指针的长度。数组和指针并不相同
#include int main(){//将数组每个元素初始化为 0 int a[5] = {0}; int b[2];
int* p = NULL; p = a;
printf(\"a = %p\\n\",a); //⾸元素的地址 printf(\"p = %p\\n\",p); //p==a。
printf(\"&p = %p\\n\",&p);//指针 p 的地址
printf(\"sizeof(a) = %d\\n\",sizeof(a));//数组的⼤⼩:20 printf(\"sizeof(p) = %d\\n\",sizeof(p));//指针的⼤⼩为 4. printf(\"\\n\"); p = b;
printf(\"b = %p\\n\",b); //⾸元素的地址 printf(\"p = %p\\n\",p); //p==b。
printf(\"&p = %p\\n\",&p);//指针 p 的地址
printf(\"sizeof(b) = %d\\n\",sizeof(b));//数组的⼤⼩:8 printf(\"sizeof(p) = %d\\n\",sizeof(p));//指针的⼤⼩为 4. //a = b; //编译错误,数组名不能作为左值;
//a++; //编译错误,数组名被编译⼀个固定地址,相当0xaabbccdd++的错误 return 0;}
数组名其实并不是指针,不能将其等同于指针。