关于指针和数组探究与老师批注.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文档。上传文档
查看更多
关于指针和数组的探究 秦老师,在您讲函数(二)的这课节上,我带着之前在学习指针和数组时,看到指针和数组的用法一样,自己认为指针就是数组的想法,我在听函数(二)时,产生非常大的困惑。当然也因为自己认为指针就是数组,而数组定义和理解起来相对指针简单许多,就只记忆了数组,忽略了指针。 在课上的困惑和对指针的忽略让我很不舒服,于是在下课后,在上网找了一段关于二级指针分配使用的代码,打算把指针弄清楚,代码如下: 第2行,将二级指针变为指针数组,即每个元素是一个指针的数组,然后在第四行给每个元素分配动态内存,这样不能保证 第2行,将二级指针变为指针数组,即每个元素是一个指针的数组,然后在第四行给每个元素分配动态内存,这样不能保证相邻两行地址是连续的 但是我发现,代码中指针的使用表示方法和我理解的数组表示的方法不一样, 这让当时认为指针就是数组的我很困惑,于是我试着输出了一些一级指针的地址,如果是数组的话,即使是二维数组,连续的一些数据的地址应该是连续的,但是在这里输出的地址却不完全连续。这让一直认为指针就是数组的我更加困惑了。 于是下面我就展开了我的指针与数组关系的探究之旅。 首先,我打算先把一级指针和一维数组关系弄清楚, 这样定义它们,对于没弄清楚之前我的来说,a和q应该是完全一样的。 这试着输出了指针和数组的地址, 这里没有问题,一级指针和一维数组的地址都是连续的。 然后我打算把这个一维的变成二维的,那么根据二维数组的定义,我就需要这个数组首地址的地址。我试着将其输出来。 第三行第一个是a,第二个是q。但是居然第三行第一个的a和第一行第一个a是一样的考虑二维数组a[3][4],a和a[0]是一样的,但是a和a[0]分别是二级地址和一级地址。,也就是变量a所储存的地址和它自己的地址居然是一样的。不应该是这样的啊,于是我想知道22FF28到底是a的储存地址还是a的地址。于是我定义了一个二级指针,按理说如果22FF28是a的地址那么就应该可以作为二级指针变量的值,但是编译时报错了二级地址未必能赋给二级指针,二级地址的本质是一种类型复杂的一级地址。,由此说明,22FF28它是一个一级地址,但是又为什么输出a时,得到的是22FF28;而且如果我无法把a赋值给一个二级指针,我就不能将它变成一个二级数组。反观q,却和自己储存的地址不一样,我将q赋值给一个二级指针,编译没有问题。好了,我找到了数组和指针的第一个区别了,虽然这值得高兴一下,但是迎面而来的问题却很严重,那就是为什么数组的首地址的地址和自己会是一样的a没有意义,C语言标准对此没有规定,Dev C++将其理解为a,这个问题让我苦思了很久。但是a作为一个变量,既然a储存了一个地址,那么a就一定有它自己的地址,于是我猜想,在数组中,a存储了一个连续地址的首地址,当访问a时,a真实的地址被隐藏,把a储存的地址返回给访问者,这样就应该可以解释为什么a不能赋值给一个二级指针,因为返回的一个一级地址是不能作为二级指针的数据的。另外,我还编译了一下a++;这条代码。也是报错a是地址常量,不能自增。a+1和第1行首地址相同,不过是二级地址。那么就是说a在定义时给的首地址的下一个连续地址是不能作为a的储存地址的。这应该就算数组和指针的第二个区别。然后下面,验证了以上的某些想法,在下面图中,22FF0C 考虑二维数组a[3][4],a和a[0]是一样的,但是a和a[0]分别是二级地址和一级地址。 二级地址未必能赋给二级指针,二级地址的本质是一种类型复杂的一级地址。 a没有意义,C语言标准对此没有规定,Dev C++将其理解为a a是地址常量,不能自增。a+1和第1行首地址相同,不过是二级地址 理解正确,指针本身的地址在栈区,分配的空间在堆区 在大概把一维数组和一级指的性质粗略清楚后,我开始分析二维数组和二级指针了。之前您讲过二维数组实质是一维数组,只是在某些位置加了标记。那么我就采用这样的想法,创建一个二维指针数组, 定义如下 要那样创建,那么我就应该把b=a;b+1算术表达式不能作为左值=(a+2);但是在编译时出现了很多错误,首先不能表示为b+1=(a+2);其次(a+2) 算术表达式不能作为左值 是不存在的,a+2是一个地址,但是这个地址却没有自己的地址,找到a+2是通过首地址的偏移完成的。经过一番思考,我的结论就是在创建二维指针数组时,是不会采用b=a;这种方式的。因为在定义**b时,就在堆区分配了两个连续内存并把返回首地址作为b储存的变量,如果b=a;这样赋值,那么原本为b分配的两个内存就没有二级指针指向它们了,因为这两个内存是在堆区,那么这样就造成了所谓的内存泄漏。且b储存了a的地址,那么b[1]就是调用a的地址的下一个地址里储存的数据,但是a的地址的下一个地址并没有定义或者说是可能用在其

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档