版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年【C语言进阶】指针笔试题(带图分析)及答案笔试题1```cinclude<stdio.h>intmain(){inta[5]={1,2,3,4,5};intptr=(int)(&a+1);printf("%d,%d",(a+1),(ptr-1));return0;}```代码分析1.`inta[5]={1,2,3,4,5};`:定义了一个包含5个整数的数组`a`。2.`&a`:这里`&a`取出的是整个数组的地址,`&a`的类型是`int()[5]`,即指向包含5个整数的数组的指针。3.`&a+1`:因为`&a`是指向整个数组的指针,所以`&a+1`跳过整个数组,也就是跳过`5sizeof(int)`个字节。4.`(int)(&a+1)`:将`&a+1`的结果强制转换为`int`类型,赋值给`ptr`。此时`ptr`指向数组`a`最后一个元素的下一个位置。5.`(a+1)`:`a`是数组名,在这里数组名代表数组首元素的地址,`a+1`指向数组的第二个元素,所以`(a+1)`的值为2。6.`(ptr-1)`:`ptr`指向数组`a`最后一个元素的下一个位置,`ptr-1`往前移动一个`int`类型的大小,指向数组`a`的最后一个元素,所以`(ptr-1)`的值为5。内存图分析```plaintext++++++|1|2|3|4|5|++++++^^^aa+1&a+1````a`指向数组首元素,`a+1`指向第二个元素,`&a+1`指向数组末尾的下一个位置。`ptr`被赋值为`(int)(&a+1)`,`ptr-1`指向数组的最后一个元素。输出结果```plaintext2,5```笔试题2```cinclude<stdio.h>structTest{intNum;charpcName;shortsDate;charcha[2];shortsBa[4];}p;//假设p的值为0x100000。如下表表达式的值分别为多少?//已知,结构体Test类型的变量大小是20个字节intmain(){p=(structTest)0x100000;printf("%p\n",p+0x1);printf("%p\n",(unsignedlong)p+0x1);printf("%p\n",(unsignedint)p+0x1);return0;}```代码分析1.`p`是一个指向`structTest`类型的指针,已知结构体`Test`类型的变量大小是20个字节。2.`p+0x1`:指针运算中,`p+1`会让指针跳过一个`structTest`类型的大小。因为`p`的值为`0x100000`,`p+0x1`会跳过20个字节,十六进制下20表示为`0x14`,所以`p+0x1`的值为`0x100014`。3.`(unsignedlong)p+0x1`:这里将`p`强制转换为`unsignedlong`类型,此时`p`就变成了一个普通的无符号长整型数。对其加`0x1`就是普通的整数加法,所以`(unsignedlong)p+0x1`的值为`0x100001`。4.`(unsignedint)p+0x1`:将`p`强制转换为`unsignedint`类型,指针运算中,`(unsignedint)p+1`会让指针跳过一个`unsignedint`类型的大小,通常`unsignedint`为4个字节。所以`(unsignedint)p+0x1`的值为`0x100004`。输出结果```plaintext0x1000140x1000010x100004```笔试题3```cinclude<stdio.h>intmain(){inta[4]={1,2,3,4};intptr1=(int)(&a+1);intptr2=(int)((int)a+1);printf("%x,%x",ptr1[-1],ptr2);return0;}```代码分析1.`inta[4]={1,2,3,4};`:定义了一个包含4个整数的数组`a`。2.`&a+1`:`&a`取出的是整个数组的地址,类型为`int()[4]`,`&a+1`跳过整个数组,即跳过`4sizeof(int)`个字节。`(int)(&a+1)`将其强制转换为`int`类型,赋值给`ptr1`。`ptr1[-1]`等价于`(ptr1-1)`,指向数组的最后一个元素,所以`ptr1[-1]`的值为4。3.`(int)a+1`:将数组名`a`(数组首元素地址)强制转换为`int`类型,然后加1,这是普通的整数加法。得到的结果再强制转换为`int`类型赋值给`ptr2`。在小端字节序的系统中,假设`a`的地址为`0x100`,数组`a`在内存中的存储如下:```plaintext地址:0x1000x1010x1020x103数据:01000000````(int)a+1`相当于地址加1,`ptr2`指向`0x101`位置。当解引用`ptr2`时,会从`0x101`位置开始取4个字节的数据。```plaintext地址:0x1010x1020x1030x104数据:00000002```所以`ptr2`的值为`0x02000000`。内存图分析```plaintext+++++|1|2|3|4|+++++^^a&a+1````a`指向数组首元素,`&a+1`指向数组末尾的下一个位置。`(int)a+1`是将地址作为整数加1后再转换为指针。输出结果```plaintext4,2000000```笔试题4```cinclude<stdio.h>intmain(){inta[3][2]={(0,1),(2,3),(4,5)};intp;p=a[0];printf("%d",p[0]);return0;}```代码分析1.`inta[3][2]={(0,1),(2,3),(4,5)};`:这里使用的是逗号表达式,逗号表达式的值是最后一个表达式的值。所以数组`a`实际初始化的值为`{1,3,5}`,其余元素默认初始化为0。```plaintext+++|1|3|+++|5|0|+++|0|0|+++```2.`p=a[0];`:`a[0]`是二维数组第一行的数组名,代表第一行首元素的地址,赋值给`p`。3.`p[0]`:等价于`(p+0)`,指向第一行的第一个元素,所以`p[0]`的值为1。输出结果```plaintext1```笔试题5```cinclude<stdio.h>intmain(){inta[5][5];int(p)[4];p=a;printf("%p,%d\n",&p[4][2]-&a[4][2],&p[4][2]-&a[4][2]);return0;}```代码分析1.`inta[5][5];`:定义了一个5行5列的二维数组`a`。2.`int(p)[4];`:定义了一个指向包含4个整数的数组的指针`p`。3.`p=a;`:将`a`赋值给`p`,这里存在类型不匹配,`a`是`int()[5]`类型,`p`是`int()[4]`类型。4.`&p[4][2]`和`&a[4][2]`:`p[4][2]`等价于`((p+4)+2)`,`a[4][2]`等价于`((a+4)+2)`。指针相减得到的是两个指针之间元素的个数。由于`p`和`a`的步长不同,`&p[4][2]-&a[4][2]`的结果是-4。5.当以`%p`格式输出时,会将-4以补码形式输出,在32位系统中,-4的补码为`0xFFFFFFFC`。输出结果```plaintext0xFFFFFFFC,-4```笔试题6```cinclude<stdio.h>intmain(){intaa[2][5]={1,2,3,4,5,6,7,8,9,10};intptr1=(int)(&aa+1);intptr2=(int)((aa+1));printf("%d,%d",(ptr1-1),(ptr2-1));return0;}```代码分析1.`intaa[2][5]={1,2,3,4,5,6,7,8,9,10};`:定义了一个2行5列的二维数组`aa`。2.`&aa+1`:`&aa`取出的是整个二维数组的地址,类型为`int()[2][5]`,`&aa+1`跳过整个二维数组,即跳过`25sizeof(int)`个字节。`(int)(&aa+1)`将其强制转换为`int`类型,赋值给`ptr1`。`ptr1-1`指向数组的最后一个元素,所以`(ptr1-1)`的值为10。3.`aa+1`:`aa`是二维数组名,代表第一行的地址,类型为`int()[5]`,`aa+1`指向第二行的地址。`(aa+1)`等价于`aa[1]`,是第二行的数组名,代表第二行首元素的地址。`(int)((aa+1))`将其强制转换为`int`类型,赋值给`ptr2`。`ptr2-1`指向第一行的最后一个元素,所以`(ptr2-1)`的值为5。内存图分析```plaintext++++++|1|2|3|4|5|++++++|6|7|8|9|10|++++++^^aaaa+1````aa`指向第一行,`aa+1`指向第二行。`&aa+1`指向整个二维数组的末尾。输出结果```plaintext10,5```笔试题7```cinclude<stdio.h>intmain(){chara[]={"work","at","alibaba"};charpa=a;pa++;printf("%s\n",pa);return0;}```代码分析1.`chara[]={"work","at","alibaba"};`:定义了一个字符指针数组`a`,每个元素指向一个字符串常量。2.`charpa=a;`:定义了一个二级指针`pa`,并初始化为`a`的地址,`pa`指向`a`的第一个元素。3.`pa++`:`pa`向后移动一个`char`类型的大小,指向`a`的第二个元素。4.`pa`:解引用`pa`得到`a`的第二个元素,即指向字符串`"at"`的指针。`printf("%s\n",pa);`会输出字符串`"at"`。输出结果```plaintextat```笔试题8```cinclude<stdio.h>intmain(){charc[]={"ENTER","NEW","POINT","FIRST"};charcp[]={c+3,c+2,c+1,c};charcpp=cp;printf("%s\n",++cpp);printf("%s\n",--++cpp+3);printf("%s\n",cpp[-2]+3);printf("%s\n",cpp[-1][-1]+1);return0;}```代码分析1.`charc[]={"ENTER","NEW","POINT","FIRST"};`:定义了一个字符指针数组`c`,每个元素指向一个字符串常量。2.`charcp[]={c+3,c+2,c+1,c};`:定义了一个二级字符指针数组`cp`,每个元素指向`c`数组中的不同元素。3.`charcpp=cp;`:定义了一个三级字符指针`cpp`,并初始化为`cp`的地址。第一个`printf````cprintf("%s\n",++cpp);```-`++cpp`:`cpp`向后移动一个`char`类型的大小,指向`cp`的第二个元素(`c+2`)。-`++cpp`:解引用`++cpp`得到`c+2`。-`++cpp`:再次解引用得到`c[2]`指向的字符串`"POINT"`。第二个`printf````cprintf("%s\n",--++
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年恩施州平安押运有限公司公开招聘工作人员备考题库参考答案详解
- 2026年临海市头门港中心幼儿园招聘备考题库及答案详解参考
- 2026年安徽皖维集团有限责任公司招聘备考题库附答案详解
- 2026年中国海洋大学水产学院实验技术人员招聘备考题库及答案详解一套
- 2026年宁波广播电视集团全资子公司招聘备考题库及答案详解参考
- 2026年厦门市集美区三社小学产假顶岗教师招聘备考题库含答案详解
- 2026年上海市松江区九亭中学教师招聘备考题库含答案详解
- 2026年东莞湾区中学赴东北地区专场招聘在编教师17名备考题库及参考答案详解1套
- 2026年中国人民大学党委保卫部(处)招聘备考题库及参考答案详解1套
- 2026年天津市西青经开区投资促进有限公司第二批次公开招聘工作人员备考题库及答案详解参考
- 2026山东省考申论试题及答案
- 土地续租赁合同(标准版)
- 语文五上:期末总复习(按单元复习)【课件】
- 养殖场安全培训课件
- 房地产机电设计注意事项汇编
- 移风易俗文明殡葬课件
- 2025年高考语文二卷诗歌鉴赏解析
- 《现代物流设施与规划》课件(共十四章)
- 医院主任年终工作总结与计划
- DGTJ08-2134-2013 建筑装饰工程石材应用技术规范
- 2025院感爆发考试试题及答案
评论
0/150
提交评论