电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

c语言指针例题

28页
  • 卖家[上传人]:涟熠
  • 文档编号:358266098
  • 上传时间:2023-08-21
  • 文档格式:DOCX
  • 文档大小:140.46KB
  • / 28 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、1、程序运行的结果是什么呢?int main()int a5 = 1, 2, 3, 4, 5 ;int* ptr = (int*)(&a + 1);printf(%d,%d, *(a + 1), *(ptr - 1); return 0;解析:*(a + 1) - 解释:就不再过多解释。*(ptr - 1) - 解释: &a表示取整个数组的地址,对其加一跳过整个数组,指针指向了红色箭头指向的位置,但是这个指针又被强制类型转换成了整形(int*)类型的指针,并存放在ptr这个整形指针变量里面去了。此时的ptr指针就是一个整形指针,对其减一就是向前跳动一个整形的地址指向了蓝色箭头的位置,*(ptr - 1)是以整形指针的视角去读取所指空间的内容,也就是从蓝色箭头的指针处向后访问一个整形(4个字节)的长度,所以读到的就是52、程序运行的结果是什么呢?备注:/p是结构体指针/假设p 的值为0x100000。 如下表表达式的值分别为多少?/已知,结构体Test类型的变量大小是20个字节struct Testint Num;char* pcName;short sDate;char cha2;sh

      2、ort sBa4;*p; int main()p = (struct Test*)0x100000;printf(%pn, p + 0x1);printf(%pn, (unsigned long)p + 0x1);printf(%pn, (unsigned int*)p + 0x1); return 0;解析:计算机内存十一字节划分的,一个字节都有一个对应的地址,地址是由16进制来表示的。printf(%pn, p + 0x1); - 解释:p = (struct Test*)0x100000;是将0x100000 强制类型转换成(struct Test*)这个结构体的地址。而我们知道指针的类型决定了指针加减整数的时候跳过的字节数;如:int*类型的指针 + 1 跳过4个字节, char* 类型的指针 + 1跳过1个字节, 所以结构体类型的指针 + 1 就跳过一个结构体。因为这个结构体的大小为20个字节,+1之后指针就向后跳20个字节,20的16进制是14 所以结果就为00100014。printf(%pn, (unsigned long)p + 0x1); - 解释:(unsigne

      3、d long)p 是将这个结构体的地址强制类型转换成无符号整形整形数字 + 1就是+1,所以结果是00100001。printf(%pn, (unsigned int*)p + 0x1); - 解释:(unsigned int*)p 是将p强制类型转换成整形指针,整形指针+1就是跳过四个字节,所以结果是00100004。3、程序运行的结果是什么呢?int main()int a4 = 1, 2, 3, 4 ;int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)(int)a + 1);printf(%x,%x, ptr1-1, *ptr2); return 0;解析:注意:本题的输出方式为十六进制输出。ptr1-1 - 解释:与笔试1类似,不再赘述。*ptr2 - 解释: a是数组首元素的地址,是十六进制的,强制类型转换成整形(int)之后再 + 1 再强转成整形指针,也就是在上几部操作后,a的地址数值加了1,地址加1 就是向后偏移了一个字节。在VS的环境下:存储方式为小端存储ptr从 01 指向了后一个字节 00。(int*)(int)a + 1)

      4、 再将其强转成整形指针,再向后访问四个字节并以十六进制的方式输出,所以结果是:2 00 00 00。以什么形式存储,就以什么形式输出,以小端存储方式存入,就以小端的方式输出。4、程序运行的结果是什么呢?int main()int a32 = (0, 1), (2, 3), (4, 5) ;int* p;p = a0;printf(%d, p0); return 0;解析:这道题很简单,逗号表达式是从左到右一次执行,并以最后一个值作为整个表达式的值。所以,数组内部布局为: 1 3 5 0 0 0所以p0就为第一个元素1。5、程序运行的结果是什么呢?int main()int a55;int(*p)4;p = a;printf(%p,%dn, &p42 - &a42, &p42 - &a42); return 0;解析:p是一个数组指针,p能够指向的数组是4个元素a 为二维数组的数组名,二维数组的数组名表示二维数组第一行的地址。同时二维数组可以理解为一位数组组成的数组。p = a;那么p + 1是向后跳了四个整形(int)16个字节。a42的地址比p42的地址高4,所以结果为-4;计算机存

      5、数据是以补码的形式存储:-4的存储100000000 00000000 00000000 00000100 - 原码111111111 11111111 11111111 11111011 - 反码111111111 11111111 11111111 11111100 - 补码以%p的形式输出,就是以16进制的形式输出,结果为:FF FF FF FC。6、程序运行的结果是什么呢?int main()int aa25 = 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;解析:与前面几题有所雷同,再次不再过多赘述。只强调一点:&aa得到的是整个二维数组的地址,对其+ 1是跳过整个二维数组。可以自己尝试解决。7、程序运行的结果是什么呢?int main()char* a = work,at,alibaba ;char* pa = a;pa+;printf(%sn, *

      6、pa); return 0;解析:注意: 形如 char* p = abcdefg;这样的p为字符指针,存放的是字符串首元素的地址。同时它是只 读 的 ,是不能被修改的。如果 *p = w;这样操作的话,编译器报警告。(访问权限冲突)a就是一个指针数组,里面存放的都是字符指针。a是数组名是数组首元素的指针,char* pa;说明pa是个指针,这个指针指向的类型是个字符指针。 pa+;就是相当于pa + 1,首元素向后跳动一个字符指针,便是at这个字符串的首地址。8、程序运行的结果是什么呢?int main()char* c = ENTER,NEW,POINT,FIRST ;char* cp = c + 3,c + 2,c + 1,c ;char* cpp = cp;printf(%sn, *+cpp);/*cp1 - *(c + 2) - c2printf(%sn, *- * +cpp + 3);printf(%sn, *cpp-2 + 3);/* 的优先级比 +的优先级第printf(%sn, cpp-1-1 + 1); return 0;解析:一开始布局:c中放的是字符串首地址。c

      7、p中放的是c中元素得地址。cpp放的是cp首元素地址。*+cpp - 解释:补充:操作符的优先级:+ 高于 * 高于 + 高于 - 先对cpp自增一次,此时cpp指向了(c + 2)的位置,一次解引用*操作就拿到了cp数组中的(c + 2),再次解引用*操作就拿到了c数组中第3个元素,第三个是个元素是字符指针,这个字符指针存放的是POINT这个字符串的首地址,%s拿到了POINT首地址向后打印,所以结果为POINT。*- * +cpp + 3 - 解释:cpp现在原只向的(c + 2)位置上自增1,此时指向了(c + 1)的位置上,解引用*一次便拿到了(c + 1),因为 - 的优先级比+高,先执行 - ,(c + 1)自减变成了c,再解引*用一次,就拿到c数组的第一个元素,第一个元素存的是ENTER的首地址,再对首地址 + 3,跳过三个字符,指向了E。%s拿到了E的地址向后打印,结果就是ER。*cpp-2 + 3 - 解释:*cpp-2 + 3 *(*(cpp - 2) + 3,cpp在指向原来的(c + 1)位置,而(cpp - 2)向前跳动两个char*的元素指向了(c + 3)

      8、的位置,但是cpp本身的值没变,这时对(cpp - 2)解引用*一次就拿到了(c + 3),再对(c + 3)解引用*一次就拿到了c数组中的最后一个元素,c数组中的最后一个元素存的是FIRST字符串的首地址,对其+3就是跳过三个字符,指向了S。%s拿到了S的地址向后打印,结果就是ST。cpp-1-1 + 1 - 解释:cpp-1-1 + 1 *(*(cpp - 1) - 1) + 1,cpp在指向原来的(c + 1)位置,(cpp - 1)向前跳动一个char*的元素指向了(c + 2)的位置,但是cpp本身的值没变,这时对(cpp - 1)解引用*一次就拿到了(c + 2),再对(c + 2) - 1得到了(c + 1),再对(c + 1)解引用*一次就拿到了c数组中的第二个元素,c数组中的第二个元素存的是NEW这个字符串的首地址,对其 +1就是跳过一个字符,指向了E。%s拿到了E的地址向后打印,结果就是EW。 9、输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。最后输出这10个整数。答案:#includeint main()int a10;int *p;p=a;int *min,*max;int i,t;max=a;min=a;for(i=1;i10;i+)scanf(%d,p+);if(*max*p)min=p;t=*max;*max=a9;a9=t;t=*min;*min=a0;a0=t;for(p=a;pa+10;p+)printf(%d,*p);10、两个变量交换答案:#includevoid swap

      《c语言指针例题》由会员涟熠分享,可在线阅读,更多相关《c语言指针例题》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.