字符数组暴力刷题

【核心知识】

先复习一下核心知识:

1. 以下2种情况数组名表示整个数组

sizeof(数组名)

&数组名

其他情况均表示首元素地址

2. 任何形式的地址的大小相同

3. strlen求的是字符串的长度,统计的是在字符串中\0之前出现的字符的个数

part1

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

part2

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',依旧是随机值

part3

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

part4

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

你可能感兴趣的:(算法)