C指针相关系列

1.一篇就够了(建议收藏)——超详解sizeof与strlen的用法
2.C语言之深入指针进阶(建议收藏以备不时之需)
3.回炉重造的C之指针+结构体

【C语言】大厂指针笔试题详解(1码+1图)——程序结果判断题

  • 笔试题1
  • 笔试题2
  • 笔试题3
  • 笔试题4
  • 笔试题5
  • 笔试题6(重点难题)

笔试题1

int main()
{int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf( "%x,%x", ptr1[-1], *ptr2);return 0; }
//程序的结果是什么?

代码分析:
int a[4] = { 1, 2, 3, 4 };

由于本人电脑是小端(将低位字节存储在起始地址)存储,所以数组在内存中的储存如图


int *ptr1 = (int *)(&a + 1);

&a+1的类型是int(*)[4],强制转化成int*类型,赋给int*型指针变量ptr1


int *ptr2 = (int *)((int)a + 1);
如图所示,将00位置的地址赋给了int*型指针变量ptr2


printf( "%x,%x", ptr1[-1], *ptr2);

因为ptr1[-1]等价于*(ptr1-1)ptr1又是int*类型的指针,大小为4字节,-1往回跳过4个字节

所以按16进制输出 ptr1[-1] 就是 4

指针ptr2里存的是00这个位置的地址,又因为这个地址是int*类型的,大小为4字节

所以*ptr2之后结果为0x02 00 00 00,按16进制打印出来是2000000

笔试题2

#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int *p;p = a[0];printf( "%d", p[0]);return 0;
}//打印结果是什么?

代码分析:
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
这句代码有个坑,就是二维数组里是小括号,小括号里的是逗号表达式(逗号表达式的取值是最后一个元素的值,计算后的最终值是一个元素),所以这里初始化二维数组时
(0,1)结果是1
(2,3)结果是3
(4,5)结果是5
最终存入二维数组的只有1,3,5 结果如图


int *p;
定义一个指针变量p


p = a[0];
a[0]是第一行数组的数组名,单独放在这里表示的就是是第一行首元素的地址,将第一行首元素的地址赋给指针变量p


printf( "%d", p[0]);
p是个指针,p[0]等价于*(p+0)等价于*(a[0]+0)等价于*a[0],所以这里打印的其实是第一行第一列的元素1,结果如下

笔试题3

int main()
{int a[5][5];int(*p)[4];p = a;printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0; }

代码分析:
int a[5][5];
初始化一个5×5的二维数组,在内存中是这样存放的


int(*p)[4];
声明一个指向4个整型元素的数组指针


p = a;
a单独使用表示的是二维数组首元素地址,也就是第一行a[0]的地址,把这个地址赋值给数组指针p


printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
逐个分析

如图&a[4][2],取a[4][2]的地址

如下图&p[4][2]
注意:指针减去指针,结果是指针之间元素的个数

分别按将变量值以地址形式即16进制形式 和整型打印结果 -4,-4的原反补码如下

打印结果如图所示

笔试题4

int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 = (int *)(&aa + 1);int *ptr2 = (int *)(*(aa + 1));printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}

代码分析:
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };


int *ptr1 = (int *)(&aa + 1);
&aa是取整个二维数组的地址,+1跳过整个数组之后,再强制类型转化成 int* 类型,并赋值给指针变量ptr1
如图


int *ptr2 = (int *)(*(aa + 1));
aa单独放,表示二维数组第一行的地址,因为指针类型是int(*)[5],+1之后其实就是第二行的地址,再将其解引用,得到的是第二行数组名,数组名单独放在这又表示数组首元素地址,将这个首元素地址强制转换成int*类型,赋值给ptr2
如图


printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
ptr1和ptr2的指针类型都是int*, -1后 , 表示的是上一个地址,如图

打印结果为

笔试题5

int main()
{char *a[] = {"work","at","alibaba"};char**pa = a;pa++;printf("%s\n", *pa);return 0;
}

代码分析
char *a[] = {"work","at","alibaba"};
定义一个char*类型的指针数组,包含三个字符串


char**pa = a;
a单独使用表示的是数组首元素地址,将首元素地址赋值给一个二级指针pa


pa++;


printf("%s\n", *pa);
*pa(pa已经自增过一次)得到的是字符串“at\0”的地址,所以通过%s打印字符串
结果是

笔试题6(重点难题)

int main()
{char *c[] = {"ENTER","NEW","POINT","FIRST"};char**cp[] = {c+3,c+2,c+1,c};char***cpp = cp;printf("%s\n", **++cpp);printf("%s\n", *--*++cpp+3);printf("%s\n", *cpp[-2]+3);printf("%s\n", cpp[-1][-1]+1);return 0;
}

代码分析
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
前三行代码可以画图表示为


printf("%s\n", **++cpp);
cpp前置++,相当于c+2的地址,*++cpp表示c+2**++cpp表示得到字符串“POINT\0”的地址,%s打印出来就是POINT


printf("%s\n", *--*++cpp+3);
这时候需要注意,cpp已经+1过了,现在指向的是c+2
现在看这行代码的符号操作顺序,方框由内向外的顺序

一步一步看
++cpp,指向c+1
*++cpp,解引用得到c+1这个空间 里存放的地址
--* ++cpp,c+1里的地址本来指向的是字符串NEW\0的地址,现在- -之后,地址实际上指向的是字符串ENTER\0的地址
*--*++cpp+3 表示的就是对指向ENTER\0地址的地址(c+1- -)解引用,得到ENTER\0的地址,+3,就是字符E的地址,最终就是从E开始打印字符,%s打印得到结果ER


printf("%s\n", *cpp[-2]+3);
cpp[-2]等价于*(cpp-2),整体表达式替换成**(cpp-2)+3
由于cpp经过上边语句的变化,现在指向的是c+1,-2之后指向的应该是c+3,两次解引用之后得到的是FIRST\0的地址,再+3,得到的就是字符S的地址,%s打印结果为ST


printf("%s\n", cpp[-1][-1]+1);
cpp[-1][-1]可以替换成*(*(cpp-1)-1)+1
cpp现在指向的c+1,-1之后指向c+2,解引用得到c+2里的地址,里边地址原本指向POINT\0的地址,现在再-1,变成指向NEW\0的地址,再对这个地址解引用得到NEW\0的地址,+1之后,表示的就是字符E的地址,%s打印结果是EW

完整运行结果如下

【C语言】大厂指针笔试题(1码+1图)详解——程序结果判断题相关推荐

  1. 进阶C语言:指针笔试题

    在学习完进阶C指针之后,可以来做一些笔试题来进行提升.巩固,小编在这里给大家分享几道比较有意思的笔试题 目录 一.笔试题1: 二.笔试题2 三.笔试题3: 四.笔试题4: 五.笔试题5: ​编辑 六. ...

  2. c++判断奇偶_第十一届(今年)蓝桥杯省模拟赛 试题+源码 C/C++详解

    后台回复开发工具,免费获取C语言常用编译器 本文章来源:CSDN|亓官劼 本文是第十一届蓝桥杯省模拟赛的试题和部分题解,博主参加的是4.13日的下午场,也就是本次模拟赛的第一天了吧,不知道有没有上午场 ...

  3. tcp测试监听工具_高清无码多图详解!性能测试六大核心体系(没人的时候偷偷看)...

    点击上方蓝字关注我们 ! 小编闭关多日,今天正式出关!值此七夕佳节,给大家送上沉痛的的祝福,祝大家节日快乐,有钱人终成眷属! 小编有话说 今天给大家介绍的是一个在课堂上整理出来的完整性能测试体系框架, ...

  4. 【维生素C语言】练习:画图解析C语言指针笔试题

    原标题:" 祖安猎码人"在线手撕代码画图解析[C指针笔试题] 前言: C语言指针笔试题,建议做完后再看答案.本篇博客有详细的解析部分,对每一道题进行深度的画图解析.如果你想复习下指 ...

  5. 这八道经典指针笔试题你都会做嘛?

    本文详细介绍了八大指针经典笔试题,内涵盖指针大部分的用法, 全部了解掌握其原理之后对指针的学习大有帮助!!! 对指针掌握 也就掌握了内存,C语言也就没有什么更绕的了 详解八道经典指针笔试题 一.八道经 ...

  6. 指针笔试题及其解析、字符串左旋、字符串追加strcat

    笔试题1 #include <stdio.h>int main() {int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);in ...

  7. Android4.0源码目录结构详解

    Android4.0源码目录结构详解 Android4.0与2.1目录差不多 alsa这块,注意external/tinyalsa下有: include/tinyalsa/asoundlib.h mi ...

  8. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  9. gray code java_格雷码Gray Code详解

    格雷码简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连",因此又 ...

最新文章

  1. pandas使用query函数基于组合索引筛选dataframe的数据行(与and、或or、非not)
  2. lvs+keepalived 集群
  3. Docker实战(一)之使用Docker镜像
  4. symbian 获取手机型号
  5. sql server 2005 优化方法
  6. POI的入门:加载解析Excel
  7. 2d 背包_和平精英:小黄脸表情头套和背包上架,这个价格真的值得买吗?
  8. [html] 如何垂直居中<img>?
  9. [Ajax] jQuery中的Ajax -- 02-jQuery中的三级联动
  10. 无法远程连接Oracle
  11. 深入理解OracleExadata
  12. 【资产管理】2020年海外头部资管机构经营特点及启示
  13. 在quill编辑器中集成秀米和135编辑器
  14. CRM——销售与客户
  15. Linux武侠文字游戏,怀旧的文字游戏,文字武侠手游哪个好玩?
  16. matlab如何插入“埃”这个符号
  17. 备赛全国阳光健身健美大赛训练记录(粗略)
  18. Python·@property属性
  19. 计算机系统软件与工具软件
  20. 公司财务发工资时,记录了当时发工资的资料Employee.txt 1.定义公司员工类Employee,属性有:工号,姓名,性别,工资(double类型),进行属性的隐藏和封装,重写toString.

热门文章

  1. ORACLE 统计男女数量
  2. OpenCV之轮廓检测(检测银行卡上的黑色磁条)
  3. xlsx文件的多表读取与写入
  4. 名帖111 董其昌 小楷《千字文》
  5. 别让“鼠标手”伸向你
  6. 如何批量生成矩阵25码
  7. 一名普通医护人员的抗疫日志
  8. 同时支持手机号、用户名、邮箱登录
  9. 实用网站集锦(2021-11-20)
  10. Double值取得小数点后两位的若干方法