sizeof(数组名),这里数组名表示“整个数组”。
sizeof(数组名+0),这里数组名(只要不是单独出现)表示数组首元素的“地址”
sizeof(*数组名),这里数组名表示数组“首元素的地址”
sizeof求字符串时要算上\0。
sizeof(数组名+0),这里数组名(只要不是单独出现)表示数组首元素的“地址”
sizeof(*数组名),这里数组名表示数组“首元素的地址”
sizeof求字符串时要算上\0。
strlen(abc def):字符串为"abc def"其后系统自动补上'\0';而求字符串长度的函数strlen()只要遇见'\0';就返回函数值!而且'\0'不算在其中!故返回值为7(空格也算一个字符!)
strlen(abc\0def):strlen函数遇到'\0'即结束,故返回值为:3
strlen()求的是地址(就是能包含该类型多少)的长度
strlen(abc\0def):strlen函数遇到'\0'即结束,故返回值为:3
strlen()求的是地址(就是能包含该类型多少)的长度
(*数组名)求得都是首地址
char p[4] = "abcd"; //给定字符串下标,其后无\0
printf("%d\n",sizeof(p));// 4
printf("%d\n",strlen(p)); //11
char p[] = "abcd";//未给定字符串下标,其后系统自动补上\0
printf("%d\n",sizeof(p)); //5
printf("%d\n",strlen(p)); //4
![](https://img-blog.csdn.net/20170405165145198?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU0NTI1MzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16 整个数组的大小
printf("%d\n",sizeof(a+0)); //4 数组的首元素1的地址大小
printf("%d\n",sizeof(*a)); //4 数组首元素1的大小
printf("%d\n",sizeof(a+1)); //4 数组的第二个元素2的地址大小
printf("%d\n",sizeof(a[1])); //4 数组第二个元素的大小
printf("%d\n",sizeof(&a)); //4 整个一维数组地址的地址大小
printf("%d\n",sizeof(&a+1)); //4 整个一维数组地址(数组外)的下一地址大小
printf("%d\n",sizeof(&a[0])); //4 数组第一个元素1的地址大小
printf("%d\n",sizeof(&a[0]+1)); //4 数组第二个元素2的地址大小
//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); //6 整个数组的大小
printf("%d\n", sizeof(arr+0)); //4 数组的首元素'a'的地址大小
printf("%d\n", sizeof(*arr)); //1 数组首元素'a'的大小
printf("%d\n", sizeof(arr[1])); //1 数组第二个'b'的大小
printf("%d\n", sizeof(&arr)); //4 整个字符数组地址的地址大小
printf("%d\n", sizeof(&arr+1)); //4 整个字符数组地址(数组外)的下一地址大小
printf("%d\n", sizeof(&arr[0]+1)); //4 数组第二个元素'b'的地址大小
printf("%d\n", strlen(arr)); //19 数组后出现\0为止的长度(随机值)
printf("%d\n", strlen(arr+0)); //19 数组后出现\0为止的长度(随机值)
//printf("%d\n", strlen(*arr)); //err 错误,*arr为首元素'a',strlen是按(该类型变量的长度) "地址"求取长度
//printf("%d\n", strlen(arr[1])); //err 错误,arr[1]为元素'b',strlen是按(该类型变量的长度) "地址"求取长度
printf("%d\n", strlen(&arr)); //19 有警告,整个数组地址到出现\0为止的长度(随机值)
printf("%d\n", strlen(&arr+1)); //13 有警告,从整个数组地址(数组外)的下一个地址开始出现\0为 止的长度(随机值)
printf("%d\n", strlen(&arr[0]+1)); //18 取数组第二个元素到出现\0为止的长度(随机值)
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4 指针变量p的大小
printf("%d\n", sizeof(p+1)); //4 指针变量p的下一地址的大小
printf("%d\n", sizeof(*p)); //1 字符串首字符a的大小
printf("%d\n", sizeof(p[0])); //1 字符串首字符a的大小
printf("%d\n", sizeof(&p)); //4 存放指针变量p的地址的大小
printf("%d\n", sizeof(&p+1)); //4 存放指针变量p的下一个地址的大小
printf("%d\n", sizeof(&p[0]+1)); //4 字符串中字符b的地址大小
printf("%d\n", strlen(p)); //6 整个字符串的长度(按字符类的地址的长度)
printf("%d\n", strlen(p+1)); //5 从第二个字符开始的字符串的长度(按字符类的地址的长度)
printf("%d\n", strlen(*p)); //err 错误,*p为字符'a',strlen是求地址长度,程序崩溃
printf("%d\n", strlen(p[0])); //err 错误,p[0]为字符'a',strlen是求地址长度,程序崩溃
printf("%d\n", strlen(&p)); //3 有警告,二级指针,生成随机数
printf("%d\n", strlen(&p+1)); //11 有警告,二级指针,生成随机数
printf("%d\n", strlen(&p[0])); //6 从字符串首地址到字符串结束(\0),字符串长度
printf("%d\n", strlen(&p[0]+1)); //5 从字符串第二个字符地址到字符串结束(\0),字符串长度
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48 整个二维数组的大小
printf("%d\n",sizeof(a[0][0])); // 4 元素a[0][0]的大小
printf("%d\n",sizeof(a[0])); //16 第一行(a[0][0],a[0][1],a[0][2])的元素的大小
printf("%d\n",sizeof(a[0]+1)); //4 第一行的下一个元素a[1][0]的大小
printf("%d\n",sizeof(a+1)); //4 首地址的下一个元素a[0][1]的地址大小
printf("%d\n",sizeof(&a[0]+1)); //4 第一行a[0]下一地址的大小(a[0][1]的地址大小)
printf("%d\n",sizeof(*a)); //16 第一行元素的地址大小(n维数组可以看做是n-1个元素的一维数组 ,所以*a是以a[0]为数组名的一维数组)
printf("%d\n",sizeof(a[3])); //16 数组外的类a型的地址大小
![](https://img-blog.csdn.net/20170405165359014?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU0NTI1MzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)