目录
字符数组和指针的笔试题(sizeof篇)
字符数组和指针的笔试题(strlen篇)
字符数组和指针的笔试题(sizeof篇)
1.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));
首先要清楚的是 arr这个数组,只存放了 'a', 'b', 'c', 'd', 'e', 'f' 这几个字符,没有存放其他东西,也没有隐藏的'\0',且 sizeof(数组名) 计算的是整个数组的大小,arr数组一共有6个元素,每个元素是1个字节的大小,所以 sizeof(arr) = 6*1 = 6字节
所以结果是 6字节
2.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr + 0));
数组名没有单独放在sizeof内部,所以计算的不是整个数组的大小,此处的arr表示的是首元素的地址,那么arr+0还是首元素的地址,只要是地址,那么sizeof(地址)的大小就是 4/8字节
所以结果是 4/8字节
3.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(*arr));
同样数组名没有单独放在sizeof内部,那么此时的arr是首元素地址,*arr 表示的是对arr解引用,得到的就是首元素 'a' ,且 'a' 是char类型,大小是1个字节
所以结果是 1字节
4.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr[1]));
arr[1] 是第二个元素,也就是 'b' ,所以结果是 1字节
5.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(&arr));
&arr 表示的是取出整个数组的地址,虽然是取出整个数组的地址,但还是地址,而且也不是数组名单独放在 sizeof内部的,所以大小为 4/8字节
所以结果是 4/8字节
6.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(&arr + 1));
整个数组的地址+1,跳过的是自身大小的1,也就是跳过整个数组,指向数组最后一个元素的下一次位置的地址,但只要是地址……
所以结果是 4/8字节
7.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(&arr[0] + 1));
&arr[0] 取出的是首元素的首地址,+1后指向的是第二个元素的首地址,所以只要是地址……
所以结果是 4/8字节
字符数组和指针的笔试题(strlen篇)
1.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", strlen(arr));
须知:strlen是库函数,作用是求字符串长度的,统计的是字符串中在'\0'之前的字符个数
且当前题目中的arr数组只是存放了 'a', 'b', 'c', 'd', 'e', 'f' 这几个字符,没有隐藏的'\0',所以strlen在求字符串长度时,strlen会从字符'a'一直往后找,直到识别到'\0‘才结束,我们并不知道在什么时候会识别到'\0',所以是随机值
所以结果是 随机值
2.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", strlen(arr + 0));
arr数组名在strlen中没有整个数组的概念,arr + 0还是首元素地址,所以结果和第一题一样
所以结果是 随机值
3.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", strlen(*arr));
须知:strlen函数参数部分是 const char* str ,需要传递一个地址,才能正常统计和访问
arr是数组首元素地址,*arr 表示的是对首元素地址解引用,那么访问的就是字符 'a' ,字符'a'的ASCII码值是79,strlen就会从97这个地址开始统计字符串长度,这就非法访问内存了
所以结果是 程序崩溃
4.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", strlen(&arr));
&arr 的类型是 char(*)[6],是数组指针,但是strlen需要的是 const char* 类型的指针,虽然类型不匹配,但是 &arr 传递时 strlen会当作 arr的地址
所以结果是 随机值