例题一:
输出结果为:
指针经典笔试题解析(C语言)
答案错误:
正确结果为:2,5
(看代码想象成看内存)
解析:
&a取出的是整个数组的地址,+1将会跳过整个数组的空间
a是数组的首元素的地址,+1将会指向数组的第二个元素
因为将数组的地址强制类型转化为int的地址
所以指针变量ptr+-整数时跳过的将是int类型大小的空间
指针经典笔试题解析(C语言)
2.例题二:
将0x100000这个整型强制类型转化为结构体指针类型
指针经典笔试题解析(C语言)
答案为:
指针经典笔试题解析(C语言)
解析:
p是全局变量
p为结构体指针变量
结构体指针类型为struct Test *
0x1就是16进制的1,就是数字1
结构体指针+1,跳过整个结构体类型的大小
unsigned long类型的数据+1,就是整数0x100000+0x1=0x100001
unsigned int指针加1,跳过4个字节空间的大小
指针经典笔试题解析(C语言)
3.例题三:
指针经典笔试题解析(C语言)
答案正确
解析:
%x打印的是16进制数字
0x后面的0会省略
但是如果是地址就不会省略
例:16进制的打印:0x02就会打印成2
地址的打印(是以16进制打印):0x001233就会打印成00112233
地址是由低到高的
我们的vs编译器是小端存储模式(数据的高位放在低地址处)(即倒叙存储)(int)a将数组名,即首元素的地址强制类型转化为整形数字+1
在将其转化为整形指针存储在ptr2中
内存中的空间大小是以一个字节为单位的
那说明首元素地址将+1个字节,跳为后面一个字节的地址
int类型的指针,能访问4个字节的空间,
又因为数组的内容是连续存储的
所以解引用ptr2将读取内存中的00 00 00 02
即20 00 00
16进制的打印:0x02就会打印成2
指针经典笔试题解析(C语言)
4.例题四
指针经典笔试题解析(C语言)
答案错误
解析:
(0,1)是逗号表达式,最后一个表达式作为整个表达式的结果,所以数组里面初始化为{1,3,5}因为是3*2的二维数组,所以连续将空间里面的值初始化为1 3 5剩下的元素都默认初始化为0
数组的初始化是使用{}
即int a[3][2] = {{0,1},{0,1},{0,1}};
将二维数组看成一维数组,每个元素为每一行的首元素的地址
a[0]相当于第一行的一维数组名,这个数组名是首元素地址
将这个首元素地址放在所对应的指针变量int*中
所以p[0]相当于*(p+0)也相当于a[0][0]
指针经典笔试题解析(C语言)
5.例题五:
指针经典笔试题解析(C语言)
答案:
指针经典笔试题解析(C语言)
解析:
a是一个5*5的int类型的二维数组
p 是指向int类型,有4个元素的数组指针
p中存放的是一个二维数组的首元素地址
所以p+1将跳过4个int类型的元素
(相同类型时)地址-地址将得到元素个数(4个)
(计算方式(16进制地址-16进制地址)/类型大小)(16/4=4)
又因为低地址-高地址将得到负数
所以得到-4
-4是以补码形式存储
%d是以十进制形式打印,所以直接是-4
%p是以地址16进制形式打印,地址是无符号整数,所以地址中-4的补码为原码
4个二进制位转换为一个16进制位,所以-4所转化的地址为0xFF FF FF FC
指针经典笔试题解析(C语言)
6.例题六
指针经典笔试题解析(C语言)
答案正确
&数组名,取出的是整个数组的地址,这是数组的地址
整个数组的地址+1,将跳过整个数组的大小
*整个数组,将得到这个数组的首元素的地址,这是单个元素的地址
相当于(*与&抵消了)剩下单个的数组名,即为首元素的地址,这也是单个元素的地址
aa是二维数组名,也是一维数组地址
可以将二维数组名aa看做有n行个一维数组地址的集合,是一维数组的首元素地址
所以aa+1将跳过一维数组的大小
*(aa+1)将取得这个一维数组的首元素的地址
*(aa+1)也可写作aa[1]
即为二维数组第二行首元素的地址
实际上,二维数组的存储也是线型的,为方便理解,我们可以将其看成矩阵坐标的形式
解析:
指针经典笔试题解析(C语言)
7.第七题:
指针经典笔试题解析(C语言)
答案正确
解析:
一维数组的数组名表示首元素地址
二级指针变量用来存放一级指针的地址
char*字符指针可以用来接收字符串,里面存放的是首字符的地址
所以a是一个一维数组,数组的每个元素类型为char*存放首字符的地址
pa+1将跳过一个字符指针地址的大小
所以pa将指向字符a的地址,解引用打印%s将打印at
指针经典笔试题解析(C语言)
8.第八题:
指针经典笔试题解析(C语言)
答案:
指针经典笔试题解析(C语言)
解析:
内存布局:
指针经典笔试题解析(C语言)
1.**++cpp
cpp先++在**两次解引用
cpp指向的是cp的首元素的地址,cpp++将指向cp第二个元素的地址,解引用得到cp第二个元素空间中存储的c+2的地址,再解引用得到字符p的地址,%s打印得到POINT
2.--++cpp+3
先++后解引用*再--再解引用*再+3
第一步中cpp已经加1
所以++时将指向cp第三个元素的地址,解引用得到cp第三个元素空间中存储的c+1的地址,再--,地址--,减去一个字节的大小,得到c的地址,并且将c++1改为c,再解引用得到字符E的地址,再加3,得到第四个元素的地址,%s打印ER
3.*cpp[-2]+3
*cpp[-2]+3相当于*(*(cpp-2))+3
4.cpp[-1][-1]+1
cpp[-1][-1]+1相当于*(*(cpp-1)-1)+1
指针经典笔试题解析(C语言)