1.char arr[] = {'a','b','c','d','e','f'};
sizeof分析类型就可以计算所占的内存空间的大小;
(1)printf("%d\n", sizeof(arr));
数组名单独放进里面,计算整个数组大小,所以是6字节;
(2)printf("%d\n", sizeof(arr+0));
第一个元素地址,是地址就是4或8,不会因为 是char类型而想成是1,因为无论是什么类型,地址的大小是不变的,就是4或8;
(3)printf("%d\n", sizeof(*arr));
首元素地址,解引用后是第一个元素,char类型,1字节;
(4)printf("%d\n", sizeof(arr[1]));
第二个元素,类型char,大小是1字节;
(5)printf("%d\n", sizeof(&arr));
数组地址,4或8字节;
(6)printf("%d\n", sizeof(&arr+1));
还是地址,虽然跳过整个数组,是地址就是4或8;
(7)printf("%d\n", sizeof(&arr[0]+1));
第二个元素地址,4或8字节;
-----------------------------------------------------------------------------------------------------------------
2.char arr[] = {'a','b','c','d','e','f'};
(1)printf("%d\n", strlen(arr));
求字符串的长度,统计字符串斜杠0之前的字符个数,字符数组里面无斜杠0,会一直向后面找,答案是随机值;
(2)printf("%d\n", strlen(arr+0));
这个还是从第一个向后找,所以是随机值;
(3)printf("%d\n", strlen(*arr));
strlen参数是地址,根据提供的地址向后找,*arr是首元素解引用就是字符a,ASCII值是97,会从97地址处开始找,所以是非法访问,非法访问97地址处的数值;
(4)printf("%d\n", strlen(arr[1]));
这个传递的参数同上,是98地址,非法访问;
(5)printf("%d\n", strlen(&arr));
chat(*)[6]转换成char*类型,数组的地址,和首个元素地址值相同,依然是从第一个元素位置开始找,所以是随机值;
(6)printf("%d\n", strlen(&arr+1));
跳过整个数组,还是地址,从最后开始找,是随机值;
(7)printf("%d\n", strlen(&arr[0]+1));
从第二个元素的地址处往后找,是随机值;
这些随机值不是没有规律的,他们之间相差的是对应的字符的个数;
---------------------------------------------------------------------------------------------------------------------------------
3.char arr[] = "abcdef";
这里的末尾有了斜杠0
(1)printf("%d\n", sizeof(arr));
7个字节;
----------------------------------------
(2)printf("%d\n", sizeof(arr+0));
首元素地址,4/8
---------------------------------------------
(3)printf("%d\n", sizeof(*arr));
首个元素,1字节;
--------------------------------------------
(4)printf("%d\n", sizeof(arr[1]));
第二个元素,1字节;
------------------------------------------------
(5)printf("%d\n", sizeof(&arr));
整个数组地址,4/8;
----------------------------------------------
(6)printf("%d\n", sizeof(&arr+1));
还是地址,4/8;
----------------------------------------------
(7)printf("%d\n", sizeof(&arr[0]+1));
还是地址,4/8;
---------------------------------------------------------------------------------------------------------------------------------
4.char arr[] = "abcdef";
printf("%d\n", strlen(arr));
6字节;
-------------------------------------
printf("%d\n", strlen(arr+0));
6字节;
--------------------------------------
printf("%d\n", strlen(*arr));
第一个元素,是字符a,这个是错误;
----------------------------------------
printf("%d\n", strlen(arr[1]));
第二个元素,字符b,这个是错误;
---------------------------------------------
printf("%d\n", strlen(&arr));
数组地址,6字节;
-------------------------------------------
printf("%d\n", strlen(&arr+1));
跳过整个数组,也跳过了斜杠0,是随机值;
-------------------------------------------
printf("%d\n", strlen(&arr[0]+1));
跳过第一个字符,5字节;
--------------------------------------------------------------------------------------------------------------------------------
5.char *p = "abcdef";
这里p指向第一个元素地址
printf("%d\n", sizeof(p));
是地址,就是4/8字节;
------------------------------------
printf("%d\n", sizeof(p+1));
指向b字符,还是地址,是4/8字节;
-----------------------------------
printf("%d\n", sizeof(*p));
访问a字符,大小是1字节;
------------------------------------
printf("%d\n", sizeof(p[0]));
*(p+0)相当于*p,是1字节
------------------------------------
printf("%d\n", sizeof(&p));
是地址,&p是二级指针,是p所在处的地址,地址是4/8;
--------------------------------------
printf("%d\n", sizeof(&p+1));
还是地址,是4/8字节;
--------------------------------------
printf("%d\n", sizeof(&p[0]+1));
指向字符b,是地址,是4/8字节;
---------------------------------------------------------------------------------------------------------------------------
6.char *p = "abcdef";
printf("%d\n", strlen(p));
从a开始,6字节;
-----------------------------------
printf("%d\n", strlen(p+1));
从b开始,5字节;
-----------------------------------
printf("%d\n", strlen(*p));
非法访问,97地址处的内存,错误的;
----------------------------------------------
printf("%d\n", strlen(p[0]));
*(p+0),还是a,是错误的;
---------------------------------------------
printf("%d\n", strlen(&p));
是随机值;
----------------------------------------------
printf("%d\n", strlen(&p+1));
也是随机值;
---------------------------------------------------
printf("%d\n", strlen(&p[0]+1));
从b开始找,所以是4字节;