sizeof和strlen对比
以上内容太过简单,之前都了解过。所以不讲以上东西,你们看一下就行
只是要额外多说两点。
1. sizeof除了操作数是类型,其他为操作数时都可以不用括号。就只有类型为操作数时必须要括号。这是硬性语法规定
2. sizeof里面如果有表达式的话,表达式不执行。
数组和指针笔试题解析
题目一,二
两个都太过简单,不过多叙述
题目三
第一行第二行为随机值 ,很简单不叙述。
第三行操作数是*arr ,为字符,因为会强制转化为地址,所以为000000097地址,这地址为计算机不可使用地址,使用了程序就崩了。
第四行同理
第五行形参是为地址跟第一行的值一样,但类型为整个数组。char (*)[5]能隐式转换为 char *,char*再隐式转换为const char *。(char (*)[5]能隐式转换为 const char *,分两步更好理解)。
所以我们这能得出char数组指针能隐式转换为char指针。对于其他类型也相同,前提是两者基本类型要相同,都要为char。 至于无const隐式转换为有const,我们都知道。
第六行同理 ,虽然最终类型相同,但地址值不同,为随机值,但比第一行的随机值少6
第七行同理,为随机值,比第一行的随机值少1
题目四
与题目三差不多,只是不是随机值,第三个第四个由于强制转化地址,所以为0000000096地址,该地址为计算机内不可使用地址,使用这类地址程序会报错。而其他的是同样的道理跟题目三一样,只是多了个\0导致结果有差异
题目五 ,六
很简单,没什么好讲的。
题目七
除了第五个和第六个其他都讲过,第五个第六个是因为他们&p为二级指针,所以并不在字符串所在的内存位置,所以遇到\0是随机的,为随机值。
题目八
除了最后一个都没什么好说的。
最后一个并不会出现越界访问,因为sizeof里面的表达式不会执行,所以不执行就不会出现越界访问。而且在运行前sizeof就已经确定好了大小(计算机模拟确定,不执行里面的操作,但模拟出最终的空间大小,作者的个人理解)所以模拟的最终空间为16,结果为16。
指针运算笔试题解析
第一题
很简单,不过多叙述
第二题
很简单,没什么好说的。但我们要说一些额外的点。
地址都是以十六进制去表示的,所以%p(表现出地址)表示的也是十六进制的数(其值为放在内存中的值,也就是补码),且必须是八个整数或十六个整数(按照环境来定)符合地址的格式。
第三题
该题虽然很简单,但有很容易忽略的点
就是在自定义时有逗号表达式( 逗号表达式就是,和()结合在一起,最终()里面的结果是最后的,右边的值)
所以这初始化是未完全初始化,只初始化了前三个1,3,5,如果要全部初始化,就要除去逗号表达式,把括号改成大括号{}。
该题结果为1.
第四题
该题我认为难点在于 %p 和%d的本质区别,%p是把数据以存放在内存中的形式(补码)转化为地址的形式用十六进制打印出来,%d是用原码打印出来十进制整数。
结果如上。证明了我的想法。
第五题
该题很简单,一个为10,一个为5.
第六题
其实不难,但这里还要额外说的一点还是%s的占位符本质。
%s比较特殊其输出字符串,对应的参数需要是字符串的地址(指针),从而最终打印其参数地址所指向的内容一直到\0之前的一个字符。这是其作用本质。
所以该题结果为打印at
第七题
这题相比其他题难度有所提升(可以说最难),需要画图才能分析清楚。
有了这图,就容易推出来结果。
我就不推了给了图你们自己推一下,有了图简单多了。结果如下。
。
总结
指针5基本上都是题目,在做题目时我们还总结了一些知识点,比如知道了多个占位符的作用,%s,%p,%x,%d到底本质是怎么作用的。还又了解了一些隐式转换。
除此之外还通过这些题目进一步提高了我们的思维能力。
所以指针(5)就到这里了。指针这一大篇就通过五大节结束了。
我们之后学习字符函数和字符串函数。