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

目录

字符数组和指针的笔试题(sizeof篇)

字符数组和指针的笔试题(strlen篇) 

小结 


字符数组和指针的笔试题(sizeof篇)

1.

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));

"abcdef" 字符串的末尾隐藏了一个 '\0' ,所以存储在 arr数组 的所有元素是['a' 'b' 'c' 'd' 'e' 'f' '\0']

数组名单独放在sizeof内部,计算的是整个数组的大小,包括 '\0'

所以结果是 7字节 

2.

char arr[] = "abcdef";
printf("%d\n", sizeof(arr + 0));

数组名没有单独放在sizeof内部,也没有取地址,所以这里的数组名代表的是首元素的地址,那么首元素的地址加0,还是首元素的地址,sizeof(地址)

所以结果是 4/8字节

3.

char arr[] = "abcdef";
printf("%d\n", sizeof(*arr));

*arr 表示为数组名是首元素地址,解引用后得到的是数组首元素,每个元素是char类型的

所以结果是 1字节

4.

char arr[] = "abcdef";
printf("%d\n", sizeof(arr[1]));

arr[1] 是第二个元素,所以结果是 1字节

5.

char arr[] = "abcdef";
printf("%d\n", sizeof(&arr));

&arr 表示的是取出整个数组的地址,整个数组的地址也还是地址,sizeof(地址)

所以结果是 4/8字节

6. 

char arr[] = "abcdef";
printf("%d\n", sizeof(&arr + 1));

整个数组的地址加1,加的是自身大小的1,也就是跳过了整个数组,指向了数组最后一个元素的下一个地址,但只要是地址,结果都是一样的

所以结果是 4/8字节

7.

char arr[] = "abcdef";
printf("%d\n", sizeof(&arr[0] + 1));

&arr[0] + 1 表示的是取出第一个元素的首地址再加1,加1后指向的是第二个元素的首地址,但只要是地址……

所以结果是 4/8字节 


字符数组和指针的笔试题(strlen篇) 

1. 

char arr[] = "abcdef";
printf("%d\n", strlen(arr));

在上篇中有说到,strlen函数的作用是统计字符串中 '\0' 之前的字符个数,且arr数组中末尾有一个隐藏的'\0'

所以结果是 6个元素

2.

char arr[] = "abcdef";
printf("%d\n", strlen(arr + 0));

arr + 0 表示的是 数组首元素地址加0,加0后还是数组首元素地址,所以结果和第一题结果一样

所以结果是 6个元素

3.

char arr[] = "abcdef";
printf("%d\n", strlen(*arr));

strlen函数的参数部分是 const char* str ,所以要传递正确的参数才能正常运行

*arr 表示的是对数组首元素地址解引用,找的的是字符 'a' 这个元素,'a' 的ASCII码值是97,编译器会把97这个数字当作参数传递给strlen函数,strlen函数就会从地址为97的地方开始往后统计字符串个数,这样就会涉及到非法访问

所以结果是 程序报错

4. 

char arr[] = "abcdef";
printf("%d\n", strlen(&arr[0] + 1));

&arr[0] + 1 表示的是 取出第一个元素的首地址后加1,加1后指向的是第二个元素的首地址,那么strlen函数就会从第二个函数开始往后统计字符串中的字符个数

所以结果是 5个元素


小结 

1.  sizeof关键字计算的是数据所占内存空间的大小

2. 只要是地址,sizeof(地址) 的大小就是 4/8字节

3. strlen函数的参数部分需要传递的是 char* 类型的参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值