欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > C语言 ——— 指针和字符数组的相关笔试题和解析(上篇)

C语言 ——— 指针和字符数组的相关笔试题和解析(上篇)

2025/9/14 5:59:00 来源:https://blog.csdn.net/weixin_55341642/article/details/140753590  浏览:    关键词:C语言 ——— 指针和字符数组的相关笔试题和解析(上篇)

目录

字符数组和指针的笔试题(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的地址

所以结果是 随机值

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词