一 前提知识
1、sizeof是一个运算符,sizeof(a)计算的是a这种变量类型或结构体所占的字节数
2、变量名一旦进行了移位操作,那么他就退化成了指针
3、数组名和对数组名取地址的值是一样的,但是含义不一样
4、数组名和指针的区别
只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:
-
sizeof(数组名):返回数组长度(所占的字节数,不是数组元素个数),而不是指向数组的指针的长度。
-
&数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。
二 一维数组

要注意的是
1)sizeof(&a)的值是4,因为它的含义是一个指针;
2)变量名一旦进行了移位操作,那么他就退化成了指针所以a+1是指针的含义,所以为4
三 二维数组





int main99912()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int n=sizeof(a[0][0]);
printf("a=0x%x,*a=0x%x\n",a,*a);
printf("a size=%d,*a size=%d\n",sizeof(a),sizeof(*a));
printf("-------------------------------------------\n");
printf("a[0]=0x%x,*(a+0)=0x%x\n",a[0],*(a+0));
printf("a[0] size=%d,*(a+0)=%d\n",sizeof(a[0]),sizeof(*(a+0)));
printf("-------------------------------------------\n");
printf("&a[0]=0x%x,&a[0][0]=0x%x\n",&a[0],&a[0][0]);
printf("&a[0] size=%d,&a[0][0] size=%d\n",sizeof(&a[0]),sizeof(&a[0][0]));
printf("-------------------------------------------\n");
printf("a[1]=0x%x,a+1=0x%x\n",a[1],a+1);
printf("a[1] size=%d,a+1=%d\n",sizeof(a[1]),sizeof(a+1));
printf("-------------------------------------------\n");
printf("&a[1][0]=0x%x,*(a+1)+0=0x%x\n",&a[1][0],*(a+1)+0);
printf("&a[1][0] size=%d,*(a+1)+0 size=%d\n",sizeof(&a[1][0]),sizeof(*(a+1)+0));
printf("-------------------------------------------\n");
printf("a[2]=0x%x,*(a+2)=0x%x\n",a[2],*(a+2));
printf("a[2] size=%d,*(a+2) size=%d\n",sizeof(a[2]),sizeof(*(a+2)));
printf("--------------------------------------- ---\n");
printf("&a[2]=0x%x,a+2=0x%x\n",&a[2],a+2);
printf("&a[2] size=%d,a+2 size=%d\n",sizeof(&a[2]),sizeof(a+2))
printf("-------------------------------------------\n");
printf("a[1][0]=0x%x,*(*(a+1)+0)=0x%x\n",a[1][0],*(*(a+1)+0));
printf("a[1][0] size=%d,*(*(a+1)+0) size=%d\n",sizeof(a[1][0]),sizeof(*(*(a+1)+0)));
printf("-------------------------------------------\n");
return 0;
}
int main99912()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int n=sizeof(a[0][0]);
printf("a=0x%x,*a=0x%x\n",a,*a);
printf("a size=%d,*a size=%d\n",sizeof(a),sizeof(*a));
printf("-------------------------------------------\n");
printf("a[0]=0x%x,*(a+0)=0x%x\n",a[0],*(a+0));
printf("a[0] size=%d,*(a+0)=%d\n",sizeof(a[0]),sizeof(*(a+0)));
printf("-------------------------------------------\n");
printf("&a[0]=0x%x,&a[0][0]=0x%x\n",&a[0],&a[0][0]);
printf("&a[0] size=%d,&a[0][0] size=%d\n",sizeof(&a[0]),sizeof(&a[0][0]));
printf("-------------------------------------------\n");
printf("a[1]=0x%x,a+1=0x%x\n",a[1],a+1);
printf("a[1] size=%d,a+1=%d\n",sizeof(a[1]),sizeof(a+1));
printf("-------------------------------------------\n");
printf("&a[1][0]=0x%x,*(a+1)+0=0x%x\n",&a[1][0],*(a+1)+0);
printf("&a[1][0] size=%d,*(a+1)+0 size=%d\n",sizeof(&a[1][0]),sizeof(*(a+1)+0));
printf("-------------------------------------------\n");
printf("a[2]=0x%x,*(a+2)=0x%x\n",a[2],*(a+2));
printf("a[2] size=%d,*(a+2) size=%d\n",sizeof(a[2]),sizeof(*(a+2)));
printf("--------------------------------------- ---\n");
printf("&a[2]=0x%x,a+2=0x%x\n",&a[2],a+2);
printf("&a[2] size=%d,a+2 size=%d\n",sizeof(&a[2]),sizeof(a+2))
printf("-------------------------------------------\n");
printf("a[1][0]=0x%x,*(*(a+1)+0)=0x%x\n",a[1][0],*(*(a+1)+0));
printf("a[1][0] size=%d,*(*(a+1)+0) size=%d\n",sizeof(a[1][0]),sizeof(*(*(a+1)+0)));
printf("-------------------------------------------\n");
return 0;
}

解决上面需要注意的问题是:
printf("a size=%d,*a size=%d\n",sizeof(a),sizeof(*a));
这句代码中,sizeof(a)表示整个二维数组的大小,*a表示*(a+0),所以,*a表示一维数组{1,3,5,7}的首地址,因此sizeof(*a)是4*sizeof(int)为16。
printf("a[0] size=%d,*(a+0)=%d\n",sizeof(a[0]),sizeof(*(a+0)));
a[0]也就是*(a+0),和*a一样,也是指向一维数组{1,3,5,7}的首地址,因此a[0],*(a+0)用sizeof计算内存大小,是4*sizeof(int)为16
printf("&a[0] size=%d,&a[0][0] size=%d\n",sizeof(&a[0]),sizeof(&a[0][0]));
&a[0]就是&(*(a+0)),&和*互相抵消,因此相当于a+0,数组名参与了指针偏移运算,因此sizeof(&a[0])的大小为指针的内存小,是4字节。&a[0][0]就是&(*(*(a+0)+0)),&和*抵消以后,为*(a+0)+0,*(a+0)代表一维数组{1,3,5,7}的首地址,因此*(a+0)+0表示数组首地址参与偏移操作,成为指向数组{1,3,5,7}0号位元素1的指针,sizeof(&a[0][0])的大小为4字节。
四 字符串数组


- #include "stdio.h"
- char *get_string_1()
- {
- char p[] = "hello world!";
- return p;
- }
- char *get_string_2()
- {
- char *p = "hello world!";
- return p;
- }
- int main()
- {
- char *p;
- p = get_string_1();
- printf("get_string_1:%s/n",p);
- p = get_string_2();
- printf("get_string_2:%s/n",p);
- return 0;
- }
输出:
get_string_1:(乱码或者没有输出,linux下没有任何输出)
get_string_2:hello world!

