C语言的2维数组的指针访问.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文档。上传文档
查看更多
C语言的2维数组的指针访问

第  PAGE 6 页 共  NUMPAGES 6页 二维数组的指针访问 ——王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点。如果真正弄懂了这个问题,就可以说你学会了使用指针。 二维数组的指针 指针就是地址,二维数组的指针就是二维数组在内存中的存储地址。相对于一维数组的地址而言,二维数组的地址稍微复杂一点。 二维数组的地址与一维数组的地址的相同点在于:①、它们的每一个元素都有一个存储地址(称为元素地址);②、它们都是将全部元素在内存中按顺序占用一段连续的存储空间;即对于一维数组,下标为1的元素的存储单元紧接在下标为0的元素的存储单元之后,下标为2的元素的存储单元紧接在下标为1的元素的存储单元之后……直到最后一个元素。对于二维数组,下标为0的行的各个元素按顺序存储完之后,下标为1的行的元素紧接其后按顺序存储……直到最后一行的最后一个元素。 二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址)。 行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义int a[5][5];则a[0][0]是a数组首行首列元素(代表该元素的值)。而a[0][0]是首行首元素的地址。a[0][0]则是首行的首地址。从这个意义上讲,可以说行的首地址是一种二重地址。 行的首地址、行的首元素地址和行的首列元素的值的关系 可以把某行的首地址、某行首列元素的地址、某行首列元素(代表它的值),看成是由高到低的三个层次。 某行首列元素作一次运算得到该行首列元素的地址,某行首列元素的地址再作一次运算得到该行的首地址。 从这个意义上讲,可以说元素的地址是一重地址,而行的首地址是二重地址。 某行的首地址作一次* 或[ ]运算得到该行的首元素的地址,某行的首元素的地址作一次* 或[ ]运算得到该行的首元素的值。 运算符 *、、[ ] 之间的关系 [ ]运算符 [ ]是下标运算符,只适用于数组和指向数组的指针变量。其优先级与( )同级,高于 * 和 。结合方向是左结合性(自左至右)。 三者的关系 * 与 互为逆运算 * 与 [ ] 等效 [ ] 与 互为逆运算 作用 前面已经提到:可以把某行的首地址、某行首列元素的地址、某行首列元素(代表它的值),看成是由高到低的三个层次。 * 和 [ ] 都是将运算对象从高层向低 层转化。 是将运算对象从低层向高层转化。 如:行的首地址作一次* 或[ ] 运算得到该行的首元素的地址。 元素的地址作一次* 或[ ] 运算得到该元素的值。 而元素(代表它的值)作一次运算得到该元素的地址。 某行的首元素的地址作一次运算得到该行的首地址。一 数组名是地址常量 若有定义int b[5];一维数组名b是什么? b与b+0 是等价的;由于* 与 互为逆运算,所以b+0 与*(b+0) 等价;由于* 与 [ ] 等效,所以*(b+0) 与b[0] 等价,*(b+0)就与b[0] 等价。可见一维数组名b与b[0] 等价。b[0] 是一维b数组首元素的地址,可见一维数组名b是一维b数组首元素的地址,也称为一维数组的基地址。 若有定义int a[5][5];二维数组名a是什么? a与a+0 是等价的;由于* 与 互为逆运算,所以a+0 与*(a+0) 等价;由于* 与 [ ] 等效,所以*(a+0) 与a[0] 等价,*(a+0)就与a[0] 等价。 a[0]与a[0]+0是等价的。由于* 与 互为逆运算,所以 a[0]+0与*(a[0]+0) 等价;由于* 与 [ ] 等效,所以*(a[0]+0) 与a[0][0] 等价,*(a[0]+0) 就与a[0][0] 等价,可见二维数组名a与a[0][0] 等价。 a[0][0] 是二维数组a的首行的首地址,可见二维数组名a是二维数组a的首行的首地址。 必须指出:数组名是一种地址常量,不能作++、 --、+=、- = 、= 等运算;可以作+运算,不能作 – 运算;可以作* 运算,一般不作运算;可以与指向本数组的同类型的指针作关系运算,一般不作逻辑运算。 行的首地址、元素的地址及元素的值的常见形式 行的首地址的表示形式 若有一个m行n列的二维数组a [m][n] 。数组名a是它的首行的首地址,也即是它0行的首地址。 从刚才的推导出:二维数组a 的首行的首地址有a 、 a+0 、 a[0] 、a[0]+0以及a[0][0]等五种形式。 由于a+0是0行的首地址。a+1就是1行的首地址,a+i就是i行的首地址。 由于* 与 互为逆运算,a+i与*(a+i) 等价,由于* 与 [ ] 等效,所以

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档