例题一: 输出结果为: 答案错误: 正确结果为:2,5 (看代码想象成看内存) 解析: &a取出的是整个数组的地址,+1将会跳过整个数组的空间 a是数组的首元素的地址,+1将会指向数组的第二个元素 因为将数组的地址强制类型转化为int的地址 所以指针变量ptr+-整数时跳过的将是int类型大小的空间 2.例题二: 将0x100000这个整型强制类型转化为结构体指针类型 答案为: 解析: p是全局变量 p为结构体指针变量 结构体指针类型为struct Test * 0x1就是16进制的1,就是数字1 结构体指针+1,跳过整个结构体类型的大小 unsigned long类型的数据+1,就是整数0x100000+0x1=0x100001 unsigned int指针加1,跳过4个字节空间的大小 3.例题三: 答案正确 解析: %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 4.例题四 答案错误 解析: (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] 5.例题五: 答案: 解析: 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 6.例题六 答案正确 &数组名,取出的是整个数组的地址,这是数组的地址 整个数组的地址+1,将跳过整个数组的大小 *整个数组,将得到这个数组的首元素的地址,这是单个元素的地址 相当于(*与&抵消了)剩下单个的数组名,即为首元素的地址,这也是单个元素的地址 aa是二维数组名,也是一维数组地址 可以将二维数组名aa看做有n行个一维数组地址的集合,是一维数组的首元素地址 所以aa+1将跳过一维数组的大小 *(aa+1)将取得这个一维数组的首元素的地址 *(aa+1)也可写作aa[1] 即为二维数组第二行首元素的地址 实际上,二维数组的存储也是线型的,为方便理解,我们可以将其看成矩阵坐标的形式 解析: 7.第七题: 答案正确 解析: 一维数组的数组名表示首元素地址 二级指针变量用来存放一级指针的地址 char*字符指针可以用来接收字符串,里面存放的是首字符的地址 所以a是一个一维数组,数组的每个元素类型为char*存放首字符的地址 pa+1将跳过一个字符指针地址的大小 所以pa将指向字符a的地址,解引用打印%s将打印at 8.第八题: 答案: 解析: 内存布局: 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语言)
精选 原创
©著作权归作者所有:来自51CTO博客作者黎大学问的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【C语言总集篇】指针篇——从不会到会的过程
【C语言总集篇】指针篇详细介绍了指针的相关知识点,深度剖析了指针与数组之间的联系,学习和复习指针的相关内容,看这一篇就够了……
C语言 指针 指针与数组 二级指针 函数指针 -
java简答 java简答题及答案
Java简 答 题1、 简述java语言的特点? 1.2Java语言是目前使用最为广泛的网络编程语言之一 (1分)具有面向对象  
java简答 java applet 数据库驱动程序 多线程