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的地址

所以结果是 随机值

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值