关于指针和数组的探及老师批注.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文档。上传文档
查看更多
关于指针和数组的探及老师批注

关于指针和数组的探究 秦老师,在您讲函数(二)的这课节上,我带着之前在学习指针和数组时,看到指针和数组的用法一样,自己认为指针就是数组的想法,我在听函数(二)时,产生非常大的困惑。当然也因为自己认为指针就是数组,而数组定义和理解起来相对指针简单许多,就只记忆了数组,忽略了指针。 在课上的困惑和对指针的忽略让我很不舒服,于是在下课后,在上网找了一段关于二级指针分配使用的代码,打算把指针弄清楚,代码如下: 但是我发现,代码中指针的使用表示方法和我理解的数组表示的方法不一样, 这让当时认为指针就是数组的我很困惑,于是我试着输出了一些一级指针的地址,如果是数组的话,即使是二维数组,连续的一些数据的地址应该是连续的,但是在这里输出的地址却不完全连续。这让一直认为指针就是数组的我更加困惑了。 于是下面我就展开了我的指针与数组关系的探究之旅。 首先,我打算先把一级指针和一维数组关系弄清楚, 这样定义它们,对于没弄清楚之前我的来说,a和q应该是完全一样的。 这试着输出了指针和数组的地址, 这里没有问题,一级指针和一维数组的地址都是连续的。 然后我打算把这个一维的变成二维的,那么根据二维数组的定义,我就需要这个数组首地址的地址。我试着将其输出来。 第三行第一个是a,第二个是q。但是居然第三行第一个的a和第一行第一个a是一样的,也就是变量a所储存的地址和它自己的地址居然是一样的。不应该是这样的啊,于是我想知道22FF28到底是a的储存地址还是a的地址。于是我定义了一个二级指针,按理说如果22FF28是a的地址那么就应该可以作为二级指针变量的值,但是编译时报错了,由此说明,22FF28它是一个一级地址,但是又为什么输出a时,得到的是22FF28;而且如果我无法把a赋值给一个二级指针,我就不能将它变成一个二级数组。反观q,却和自己储存的地址不一样,我将q赋值给一个二级指针,编译没有问题。好了,我找到了数组和指针的第一个区别了,虽然这值得高兴一下,但是迎面而来的问题却很严重,那就是为什么数组的首地址的地址和自己会是一样的,这个问题让我苦思了很久。但是a作为一个变量,既然a储存了一个地址,那么a就一定有它自己的地址,于是我猜想,在数组中,a存储了一个连续地址的首地址,当访问a时,a真实的地址被隐藏,把a储存的地址返回给访问者,这样就应该可以解释为什么a不能赋值给一个二级指针,因为返回的一个一级地址是不能作为二级指针的数据的。另外,我还编译了一下a++;这条代码。也是报错。那么就是说a在定义时给的首地址的下一个连续地址是不能作为a的储存地址的。这应该就算数组和指针的第二个区别。然后下面,验证了以上的某些想法,在下面图中,22FF0C和3E382C的地址距离很远,这让我明白了,指针和数组的第三个区别,数组是在栈区开辟一系列的内存,用来储存数据,而指针是在栈区找一个地址然后在这个地址里储存一个首地址,这个首地址是在堆区里开辟的一系列的内存的首地址。这样指针和数组的第三区别,也是实质上的区别我也渐渐明析了。(这一点可能老师您在课上讲过,但是当时我沉浸在指针就是数组的想法中,加上本来就对指针不是很能理解,可能忽略这一个知识点) 在大概把一维数组和一级指的性质粗略清楚后,我开始分析二维数组和二级指针了。之前您讲过二维数组实质是一维数组,只是在某些位置加了标记。那么我就采用这样的想法,创建一个二维指针数组, 定义如下 要那样创建,那么我就应该把b=a;b+1=(a+2);但是在编译时出现了很多错误,首先不能表示为b+1=(a+2)b=a;这种方式的。因为在定义**b时,就在堆区分配了两个连续内存并把返回首地址作为b储存的变量,如果b=a;这样赋值,那么原本为b分配的两个内存就没有二级指针指向它们了,因为这两个内存是在堆区,那么这样就造成了所谓的内存泄漏。且b储存了a的地址,那么b[1]就是调用a的地址的下一个地址里储存的数据,但是a的地址的下一个地址并没有定义或者说是可能用在其它地方了和这一个数组没有任何关系,这样调用完全是错误的。那么创建二维指针数组不能标记a的地址,那我就来标记一级地址试试, 这样一试,结果是正确的,那么说明标记一级地址是正确的。 在下图中 修改最后一条语句成,输出结果也正确,如此一来,也就能明白最开始让我困惑的类似的表示方法。到此,对二维指针数组,我也基本明白了。那么就再来看看二维数组。探究也是从地址开始。 从这里的地址也可以看出,首地址和首地址的地址以及首地址的地址的地址,全部都22FF30,在之前的探究中,可以明白22FF30肯定是个一级地址,那么由此可以下相同的结论,那就是首地址的地址也是被隐藏了的,访问时也是返回首地址。观察第四个和第五个地址,也是相同的。那么也就是有可能数据3的地址也

文档评论(0)

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

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

1亿VIP精品文档

相关文档