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,后续不再赘述