深入理解指针(5)

1.strlen函数

2.数组和指针笔试题解析

1.strlen函数

头文件:string.h

功能:求字符串长度,长度由null字符决定

功能的实现:从所给地址开始数,一次访问一个字节,一直数到NULL为止

参数:参数类型为const char*(char*也是兼容的),参数是字符指针

返回值:返回值类型是size_t,返回值是字符串长度

2.数组和指针笔试题解析

2.1一维数组

数组名单独出现在sizeof里面,计算的是数组的大小。数组有四个int型的元素,共16字节。

a没有单独出现在sizeof里面,表示数组首元素的地址,加0不变。

在X86的环境下,地址占4个字节

在X64的环境下,地址是8个字节

本节我们都用X86的环境

数组名没有单独出现在sizeof里面,表示首元素的地址,解引用后找到数组首元素,因为元素是int型,所以大小是4

a是地址,+1后还是地址,是地址就是4个字节

下标访问找到第2个元素,元素是int型,大小是4

&a表示整个数组的地址,是地址大小就是4

&a表示整个数组的地址

*&a找到数组a,数组就是数组名,所以*&a就是a

*&a这个整体是数组名,单独出现在sizeof内部,表示整个数组的大小,为16字节

&a表示整个数组的地址,加一后还是地址,大小为4字节。

【】的优先级大于&,a先于【】结合,找到第一个元素,取出地址,大小是4字节

&a【0】是地址,加一后还是地址,大小是4字节。

2.2字符数组

arr作为数组名单独出现在sizeof里面,计算的是整个数组的大小,为6个字节

arr是首地址,+0后还是地址,大小为4字节

arr是首地址,解引用后找到首元素,大小为1字节

arr下标访问找到二个元素,大小为1字节

&arr表示整个数组的地址,大小为4字节

&arr表示整个数组的地址,加一后还是地址,大小为4字节

arr【0】表示首元素,&arr【0】表示首元素地址,+1后还是地址,大小是4字节

arr表示首元素地址,strlen从第一个字符开始数,数到字符‘f’也没有遇到‘\0’,所以继续数,后面的内容是不确定的,所以是随机值。

arr+0是首元素地址,与上一个同理,是随机数

*arr表示首元素,即字符‘a’,strlen的参数是地址,会将字符‘a’的ascll码值的补码转换成地址进行访问,明显越界了,err

arr【1】表示字符‘b’,与上一个同理,越界了

&arr是数组的地址,类型是char(*)【6】,不兼容,报错。

&arr+1后类型不变,同理,报错

&arr【0】是首元素地址,加一后是第二个元素的地址,但是字符数组未设置终点(\0),所以是随机值

字符串是只读数组,数组是数组名,数组名是首元素地址。strlen从a开始数,数到f遇到\0,返回6.

地址+0还是0,与上一题类似,不再赘述

strlen的参数是地址,而不是某地址指向的元素

同理,报错

某元素地址的指针也是不行的,strlen接受const char*类型或char*类型,const char**是不行的

二级指针加1还是二级指针,不合法

首元素地址指向a,+1后指向b,字符串末尾有个\0,所以是5.

字符串是只读数组,且数组最后一个元素是\0,arr是数组名,单独放在sizeof里计算的是整个数组的大小,共7个字符,所以大小是7。

arr是数组名,表示首元素地址,+0后还是地址,地址的大小都是4

arr是首元素地址,解引用找到首元素,首元素是字符型,大小是1

第二个元素的大小也是1

&arr表示整个数组的地址,是地址,大小就是4

地址+1还是地址

&arr【0】是首元素地址,+1后还是地址

p是指针变量,指针大小就是4(指针变量不具有数组性质,p不能解读为数组名)

指针+1还是指针

解引用找到首元素,大小是1字节

下标访问第一个元素,大小是1

&p是二级指针,是指针大小就是4

指针+1后还是指针,大小是4

&p【0】是字符串首元素地址,+1后还是地址,大小是4

p指向数组中的字符a,strlen从a开始数,数到字符f结束,结果是6

p的类型是const char*,+1跳过一个字节,p+1指向字符'b'.

解引用后类型是char,不能放在strlen内

下标访问后找到首元素,类型不符合

strlen不接受(const)char**或char**的参数

&p+1还是const char**类型,strlen不接受

&p【0】是首元素地址,指向字符a,+1后跳过一个字节,指向字符b,后续不再赘述

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

INUYACHA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值