先复习一下核心知识:
1. 以下2种情况数组名表示整个数组
sizeof(数组名)
&数组名
其他情况均表示首元素地址
2. 任何形式的地址的大小相同
3. strlen求的是字符串的长度,统计的是在字符串中\0之前出现的字符的个数
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
后面就是解析啦,先做再往后看
----------------------------------
printf("%d\n", sizeof(arr));
sizeof(数组名)表示整个数组的大小,即6
printf("%d\n", sizeof(arr+0));
并非sizeof(数组名)的形式,则arr表示首元素地址,所以sizeof(arr+0)表示的就是首元素地址的大小,即4或8(取决于是x86还是x64的环境)
printf("%d\n", sizeof(*arr));
arr表示首元素地址,解引用后为首元素,所以大小为1
printf("%d\n", sizeof(arr[1]));
arr[1]表示第二个元素,等价于*(arr+1),所以大小为1
printf("%d\n", sizeof(&arr));
&arr表示整个数组的地址,只要是地址大小都是4或8
printf("%d\n", sizeof(&arr+1));
&arr表示整个数组的地址,&arr+1表示的是跳过整个数组后,下一个位置的地址,也是4或8
printf("%d\n", sizeof(&arr[0]+1));
&arr[0]表示首元素地址,题目等价于sizeof(arr+1),即第二个元素的地址,同样4或8
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
后面就是解析啦,先做再往后看
----------------------------------
printf("%d\n", strlen(arr));
strlen统计的是在字符串中\0之前出现的字符的个数,此数组不包含\0,所以会生成随机值
printf("%d\n", strlen(arr+0));
arr+0依旧是首元素地址,与第一题相同,还是生成随机值
printf("%d\n", strlen(*arr));
*arr表示的是首元素,'a',传进去的是ASCII码值97,而如果直接访问97就是非法访问
printf("%d\n", strlen(arr[1]));
arr[1]表示第二个元素,所以也会出错,类似上一问
printf("%d\n", strlen(&arr));
&arr表示整个数组的地址,属于数组指针char (*) [6],而strlen的参数类型是字符指针char*,所以可能会报警告,但是因为此数组没有'\0',所以还是生成随机值
printf("%d\n", strlen(&arr+1));
此问与上一问类似,不过这是指向整个数组的下一个位置的地址,与上一问类似,也是随机值
printf("%d\n", strlen(&arr[0]+1));
&arr[0]+1表示第二个元素的地址,但是没有'\0',依旧是随机值
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
后面就是解析啦,先做再往后看
----------------------------------
printf("%d\n", sizeof(arr));
整个数组的大小,包括'\0',结果为7
printf("%d\n", sizeof(arr+0));
表示首元素地址,地址的大小4或8
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
传首元素或者第二个元素进去,大小为1
printf("%d\n", sizeof(&arr));
表示整个数组的地址,本质还是地址,结果为4或8
printf("%d\n", sizeof(&arr+1));
整个数组的下一个地址,是地址就是4或8
printf("%d\n", sizeof(&arr[0]+1));
第二个元素地址,4或8
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
后面就是解析啦,先做再往后看
----------------------------------
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
传首地址,找'\0',结果为6
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
传首元素或第二个元素,出错,非法访问
printf("%d\n", strlen(&arr));
整个数组的地址,值与首元素地址相同,所以返回值为字符串长度6
printf("%d\n", strlen(&arr+1));
整个数组后一个位置的地址,生成随机值
printf("%d\n", strlen(&arr[0]+1));
第二个元素的地址,所以返回值为5