文章目录
前言
本篇都将是练习题,从而让你对指针的理解更上一层楼
一、sizeof & strlen
sizeof
在学习操作符的时候,我们学习了sizeof、sizeof计算变量所占内存空间大小,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小
sizeof只关注占用内存空间的大小,不在乎内存中存放什么数据
strlen
strlen是C语言函数,功能是求字符串长度,函数原型如下:
size_t strlen (const char* str);
统计的是从strlen函数的参数str中这个地址开始向后,\0之前字符串中字符的个数
strlen函数会一直向后找\0字符,直到找到为止,所以可能存在越界查找
sizeof和strlen的对比
二、数组和指针笔试题解析
一维数组
你能说出它们的输出吗?
结果如下:
字符数组
请你继续说出它们的输出~
结果如下:
那接下来的这个呢,它们的输出又如何?
结果如下:
再看看这个:
结果如下:
继续:
结果如下:
再看看:
结果如下:
再看!:
结果如下:
二维数组
哈哈,还没结束呢!
请看:
结果如下:
三、指针运算笔试题解析
题目1
答案是 2 ,5,图片如下:
题目2
本题很有意思,把一个0x100000强制转换成地址赋值给p,然后再进行运算
本题其实考察的是指针 + 整数的意思
很显然:
第一个打印中,p被强制转换成无符号长整数,那也是整数,所以,第一个就是输出0x100001;
第二个打印中,p被强制转换成无符号整数指针,指针 + 1,就是跳过类型长度的字节数,所以输出0x100004
题目3
本题还是比较阴险的,注意大括号里面的是圆括号,这时候就要联想到逗号表达式
我们先来看看调试:
原来,我们像(0, 1)这样的式子,逗号表达式取后面的1,拿来给a初始化了,还是蛮有意思的
题目4
画图很重要,请认真画图!
首先a的地址赋给p,无视警告,p指向的是四个元素的整型数组
p先跳四次四格的int,再跳两次一个的,跳到如图的红色位置,这就是p[4][2],绿色部分就是a[4][2]
此时,我们还要想指针-指针得出来的是一个整数,而%p打印的是地址,把-4当成地址,也就是把内存中-4的补码以0x…形式打印出来
所以%p打印FFFFFFFC,%d打印原码-4
题目5
还是要常画图:
答案是 10,5
题目6
这样就很显然了,答案是打印at
题目7
初看下标-1,一开始可能会感到有些奇怪,其实之前也说过,下标访问符[ ]没那么神秘,arr[i]也就是*(arr + i)而已
接着开始画图:
答案如下;
结束~
总结
指针的教学到这里就结束了,但是指针的运用会贯穿我们之后整个的学习路程,大家要好好掌握!