CC++指针笔记.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CC指针笔记

1、void main () { int a[5]={1,2,3,4,5}; int *p=(int*)(a+1); printf(%d\n,%d\n,*(a+1),*(p-1)); } 首先解释 a与a 他两的值一样但是意义不同,a表示的是数组首元素的首地址(处于元素层,加减是以元素所占内存大小为单位计算),a表示的是数组的首地址(以数组整个长度为单位进行计算)。这样再来解释监视窗口的值的得来,首先 a为数组首地址 和a即a[0]的地址一样0x0012ff50, a 的类型是 int(*)[5] 指针——指向int[5]数组的首指针 a为数组首元素首地址为0x0012ff50即a[0]的地址, a 的类型是 int[5] 数组 a+1即为a[0]的首地址+1,即为a[0]+sizeof(int)=0x0012ff50+4=0x0012ff54, a+1即数组的首地址+这个数组的长度 即 0x0012ff50+5*sizeof(int)=0x0012ff50+20=0x0012ff64 显然已经超越了数组的界限。 p为a+1强制转换的地址 即为0x0012ff64 所以 *(a+1)=a[1]=2 *(p-1)=a[4]=5 a[0] 的类型是 int * 指针——指向int类型的指针。 sizeof(a)=20; sizeof(*a)=4 =sizeof(a[0]); sizeof(*a)=20;//因为p=a,所以=sizeof(*p),而*p=a,所以=sizeof(a)=20; 2 、 #includestdio.h void main () { struct Test { int Num; //4字节 char *pcNume; // 4字节 short sDate; //2字节 char cha[2]; //2字节 short sBa[4]; //8字节 }*p; } 问题: p+0x1=? (unsigned int*)p+0x1=? (unsigned long)p+0x1=? 问题目的:搞懂一个指针变量与一个整数相加减,怎么解析。 分析:p为指针 所以sizeof(p)=4 *p占20字节 P的值为0xcccccccc p+0x1的值为0xcccccccc+sizeof(*p) * 0x1=0xcccccccc+0x14=0xcccccce0 /////////与a+1一样,指针变量与一个整数相加减并不是用指针变量里的地址直接相加减,这个整数的单位不是byte而是元素的个数。 (unsigned int*)p 这里被强制转换成一个指向无符号整型的指针 , 所以(unsigned int*)p+0x1=0xcccccccc+sizeof(unsigne int) * 0x1=0xcccccccc+0x4=0xccccccd0。 (unsigned long)p 任何数据一旦强制转换,其类型就改变,所以P不再??指针,他的值依然是0xcccccccc(十进制为3435973836),只是 (unsigned long)p+0x1变成了一个无符号数加上一个整数,其值为0xcccccccd. 3、 void 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); //ptr1[-1]=*(ptr1-1) } 分析: a代表数组的首元素的首地址,(int)a强制转换后为一个整数,转换后 a不再代表地址,所以加1,相当于直接加1,再经过强制转换成地址赋给ptr2,,则这时ptr2所指的地址为a[0]的第二个字节(a[0]共占4个直接),所以ptr2的值为0x0012ff54+1=0x0012ff55开始的四个字节。*ptr2的值就要考虑计算机的大小端模式了,我的电脑为小端模式,所以值16进制0x2000000)。

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档