一 前提知识
1、sizeof是一个运算符,sizeof(a)计算的是a这种变量类型或结构体所占的字节数
2、变量名一旦进行了移位操作,那么他就退化成了指针
3、数组名和对数组名取地址的值是一样的,但是含义不一样
4、数组名和指针的区别
只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:
-
sizeof(数组名):返回数组长度(所占的字节数,不是数组元素个数),而不是指向数组的指针的长度。
-
&数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。
二 一维数组
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/8a8057ed-4c7e-4ce6-a017-f77fe287efc2.png)
要注意的是
1)sizeof(&a)的值是4,因为它的含义是一个指针;
2)变量名一旦进行了移位操作,那么他就退化成了指针所以a+1是指针的含义,所以为4
三 二维数组
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/105307f5-32b1-4068-b715-77f0a47653ca.png)
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/2aba8c08-c60b-43b2-930d-78c6b1c10b1d.png)
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/3fdc0b3c-1cbf-4077-96a8-7c360ecd888e.png)
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/bb9c2dd7-a771-4770-a5fa-3b0fcf23acfa.png)
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/3d0ee34b-82a5-4d31-a623-c9720bfc091d.png)
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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/d5d5feaa23a41d964e4c315010217393.png)
解决上面需要注意的问题是:
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字节。
四 字符串数组
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/d91340af-5c50-4902-a19a-b5901a56b3f2.png)
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/e7173425-6b3b-4f87-a858-76d3dee3e1c3.png)
- #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!
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/b5adee62-d2a1-4f6c-b7f2-9782704d9cf2.png)
![](https://note.wiz.cn/api/document/files/unzip/a44ecc7e-d8c6-417d-9da1-66fe54ccad74/cfe2c744-03b4-4f85-88c1-56dfbd24ae26.1110/index_files/6ff4d1b0-3d2e-4341-a7b8-b4234774a903.png)