C语言的二数组的指针访问

二维数组的指针访问

——王炳华

指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点。如果真正弄懂了这个问题,就可以说你学会了使用指针。

二维数组的指针

指针就是地址,二维数组的指针就是二维数组在内存中的存储地址。相对于一维数组的地址而言,二维数组的地址稍微复杂一点。

二维数组的地址与一维数组的地址的相同点在于:①、它们的每一个元素都有一个存储地址(称为元素地址);②、它们都是将全部元素在内存中按顺序占用一段连续的存储空间;即对于一维数组,下标为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) 等价,由于*

c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc相关推荐

  1. 乱拔插U盘,导致U盘变成RAW未初始化格式,容量大小为0。

    I 乱拔插U盘,导致U盘变成RAW未初始化格式,容量大小为0. II 我需要恢复数据啊啊啊啊 下载一个"easyrecovery数据恢复软件"将U盘里面的资料恢复出来了之后,再格式 ...

  2. vs使用未初始化的内存怎么解决_遇到C语言内存错误怎么办?一定要找准这六个原因...

    一.没有为指针分配内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.结构体成员指针未初始化 struct student ...

  3. C 语言未初始化的局部变量是多少?

    作者 | dog250 责编 | 屠敏 头图 | CSDN 下载自东方 IC 出品 | CSDN 博客 C语言中,未初始化的局部变量到底是多少? 答案往往是: 与编译器有关. 可能但不保证初始化为0. ...

  4. C语言未初始化的局部变量是多少?

    C语言中,未初始化的局部变量到底是多少? 答案往往是: 与编译器有关. 可能但不保证初始化为0. 未确定. 总之,全部都是些一本正经的形而上答案,这很令人讨厌. 但凡一些人给你滔滔不绝地扯编译器,C库 ...

  5. c语言中结构体变量怎么初始化为0,C语言高级编程:数组和结构体初始化为0的方法...

    测试平台:64位 X86 Ubuntu 1. 代码: #include #include struct st_stu { char *name; int age; int class; }; void ...

  6. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  7. 一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

     打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[ ...

  8. 对C语言 结构数组 指向结构变量的指针 指向结构数组的指针

    一.结构数组的定义 数组的元素可以是结构类型的.结构数组的每一个元素都是具有相同的结构类型的下标结构变量.在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体. 如:一个班的学生的档案,一个车 ...

  9. 下标要求数组或指针类型_算法一看就懂之「 数组与链表 」

    数据结构是我们软件开发中最基础的部分了,它体现着我们编程的内功.大多数人在正儿八经学习数据结构的时候估计是在大学计算机课上,而在实际项目开发中,反而感觉到用得不多. 其实也不是真的用得少,只不过我们在 ...

最新文章

  1. python太阳花的编程_python大佬养成计划----HTML DOM
  2. 最详细的java泛型详解
  3. P1332,nssl1316-血色先锋军【bfs】
  4. Power BI:M与DAX以及度量与计算列
  5. 小程序商店刷榜_APP推广人必看|全球刷榜价格表单
  6. 数据结构与算法之-----总览
  7. “一云多Region”究竟能为企业解决什么问题?
  8. 纯html 404页面,一款纯css3实现的漂亮的404页面_html/css_WEB-ITnose
  9. html中字体 楷体_css设置各种中文字体如雅黑、黑体、宋体、楷体等等
  10. 《2020职场绿茶图鉴》
  11. 小麦颗粒数目matlab,求关于matlab中rice.png图像中的米粒数目的算法
  12. 在ArcGIS中自定义符号制作时,发现无法正常使用符号单位,是怎么回事?
  13. 知名网站的 404 页面长啥样?最后一个我惊呆了!
  14. python读取word内容复制粘贴_如何复制word文档的内容?
  15. vim:修改vim录制的宏
  16. Python ctypes的byref和pointer区别
  17. [iOS]仿微博视频边下边播之滑动 TableView 自动播放
  18. 《使用第三方库来显示jpeg图片》
  19. 证书详解及使用openssl生成自签证书与SAN多域名证书
  20. mysql的sql语言学习笔记总结

热门文章

  1. 如何一本正经地写出别人无法维护的代码?
  2. 抛弃 VS Code 我还能用啥编辑器?| 技术头条
  3. 开源图数据库项目 DGraph 的前世今生 | 技术头条
  4. 深入聊一聊 Spring AOP 实现机制!
  5. Google 正在“跟踪”你
  6. 科学家之殁,竟是区块链之过?
  7. @程序员,你的技术过气了吗?
  8. 盘点 2017 年度最受欢迎的十大 Linux 服务器发行版
  9. 输入矩阵java_java如何输入一个自定义矩阵
  10. linux把虚拟机上的文件共享,[转]windows中vmware虚拟机中的Linux如何进行文件的共享...