笔试题目实战(2)

张开发
2026/4/22 17:26:00 15 分钟阅读
笔试题目实战(2)
文章目录前言一二三四五六七总结前言本文主要记录一些指针运算笔试题进行分析以便更好的学习与理解。一inta[5]{1,2,3,4,5};int*ptr(int*)(a1);printf(%d,%d,*(a1),*(ptr-1));我们来分析一下其输出结果首先a是一个数组a1表示的是跳过整个a数组的指针也就是ptr指针应该是指向元素5的下一个位置那么*a1应该指向的是第二个元素也就是2而ptr-1应该指向第5个元素解引用应该得到5 。运行验证一下二//x86环境结构体大小为20个字节structTest{intNum;char*pcname;shortsDate;charcha[2];shortsBa[4];}*p(structTest*)0x100000;intmain(){printf(%p\n,p0x1);printf(%p\n,(unsignedlong)p0x1);printf(%p\n,(unsignedint*)p0x1);return0;}在C语言中指针加法规则是p的地址加上nsizeof指针类型这里n为0x1而sizeofTest题目给出为20个字节。也就是0x14也就是说最后输出的结果应该是0x1000000x14 0x100014。第二个将指针p转换成数值类型unsigned long因此会直接加上0x1最终输出0x100001 。 第三个将指针p强制转换成unsigned int类型根据指针步长规则指针加法会自动按照指向类型大小计算步长这里要加上0x4最终输出0x100004 。要是题目要求我们自己计算结构体大小那么我们要知道结构体对齐规则结构体的总大小必须是其最大成员对齐字节数的整数倍成员之间会自动填充空白字节满足对齐要求。三inta[3][2]{{0,1},{2,3},{4,5}};int*p;pa[0];printf(%d\n,p[0]);因为二维数组a[0]指向的是第0行的一维数组所以p指针应该指向的是01所以p[0]应该就是该数组的首元素也就是0。四inta[5][5];int(*p)[4];pa;printf(%p,%d,p[4][2]-a[4][2],p[4][2]-a[4][2]);首先a是一个二维数组然后p是一个指向4个int类型的数组的数组指针。当运行pa类型是int*5发生隐式类型转换p的步长变成4个int的长度。a[4][2]表示第四行第二列元素计算方式为首地址4 *54 24 首地址88 。而p[4][2] 表示p向后移动4个步长每个步长16字节计算方式为首地址4 * 162 *4 首地址72 。因此地址相减得到16为地址差又因为指针相减是元素的个数差还要除去元素的类型也就是4最后得到4 .五intaa[2][5]{1,2,3,4,5,6,7,8,9,10};int*ptr1(int*)(aa1);int*ptr2(int*)(*(aa1));printf(%d,%d,*(ptr1-1),*(ptr2-1));aa1表示跳过一整个数组就是指向元素10的下一个位置-1得到10的地址解引用得到10。aa1指向第二个数组的首元素也就是6-1指向5.六char*a[]{work,at,alibaba};char**paa;pa;printf(%s\n,*pa);a是一个指针数组存放字符串的首元素地址。char **pa aa作为数组名在表达式会退化成首元素的指针就是a[0]pa指向第二个元素也就是“at”最后解引用输出at。七char*c[]{ENTER,NEW,POINT,FIRST};char**cp[]{c3,c2,c1,c};char***cppcp;printf(%s\n,**cpp);//pointprintf(%s\n,*--*cpp3);//erprintf(%s\n,*cpp[-2]3);printf(%s\n,cpp[-1][-1]1);这一题比较复杂我们一个个看。首先第一个输出cpp那么应该是指向cp[1]的位置也就是c2再解引用得到c[2],也就是POINT。第二个考验我们运算优先级首先先是自增cpp是指向cp[2]的位置因为在第一个输出的时候已经自增了1了然后解引用得到c1再自减得到c解引用指向c[0]3表示从第三个开始输出字符串不包括第三个最终输出ER。第三个cpp[-2]表示cpp指向cp0再解引用得到c[3]3表示从第三个开始输出字符串输出ST.第四个cpp先与第一个[-1]结合指向cp[1]的位置而cp[1]-1得到c1解引用得到c[1],1从第一个开始输出输出EW 。总结这就是全部内容希望能对大家有所帮助。

更多文章