二维数组名再取地址是什么
来源:互联网 发布:mysql 存储过程 编辑:程序博客网 时间:2024/04/30 06:53
ww6582163 | 分类:互联网 | 浏览246次
举报| 2013-11-26 18:21提问者采纳
此处的 &a 的类型是char (*)[5][20],即指向整个数组的。就如同 int s[30]; 中的&s 一样,它的类型是(*)[30],所指向的是整个的一维数组,如果你将它赋值给一个指针变量时只能赋值给一个 int(*p)[30];否则一般的编译器都会给出警告。尽管它们的值都和 a 或 s 是一样的,但是基类型已经完全不同,这点楼主可以通过输出 a 、a+1、&a、&a+1 来进行验证。为了加强理解,下面楼主可以根据如下叙述来思考:为了指向一个二维数组的行,我们需要定义一个相应的行指针,然后使该指针指向它的某一行。比如, int a[10][30]; int (*p)[30]=a; 这样就使得 p 指向了该数组的第 1 行(整个的第1行),而我们知道 a 等价于 &a[0],而 a[0] 是第 1 个分数组的名字,也是它的起始地址,可是我们赋值给指向这个数组的指针的却是该数组名字的地址。数组名是一个常量,按说取地址应该无意义,编译器不应该允许有这样的运算,就如同我们进行&8不允许一样,但是数组的名字有其特殊性,如果不允许你程序中给出的&a 的话,那么 int a[10][30]; int (*p)[30]=a; 就该与其矛盾了,也就无法通过编译,那编写编译器程序的人就该费脑筋去思考如何既不允许对 “常量”取地址,又能令int a[10][30]; int (*p)[30]=a; 能很好的进行了。
追问
定义一个一位数组a [10],&a等于(*a)[10];定义一个二维数组a[10][10],它在内存中还是线性存储,所以&a等于 (*a)[10*10];二维数组的行指针,(*a)[10]应该是在这个线性表中每十个元素一个指针那样的形式,是假象的,我的理解对吗?
回答
你的理解基本差不多,有些东西说不清楚,属于只可意会不可言传的情况,可能你真正理解了,但是想表述清楚是比较难的。 有的地方的理解似乎有点问题,因为 &a 并不等价于 (*a)[10],因为后者是一个指针变量,如果使用它必须先给它赋值,而前者是一个常量,是不能赋值的。这点有些像 下面的例子:int a[10];int *p=a;你不能说 定义了 int a[10],尽管a的类型是 int *,但 a 不能说等于 *a 一样。楼主对 C 能进行如此深入的思考,进步会很快的,希望早日有所成就!
- 提问者评价
谢谢你的回答,很有用,借你吉言,共同进步
0 0
- 二维数组名再取地址是什么
- 关于二维数组名是什么?
- 数组名取地址是什么?
- 二维数组名与地址的对应
- 对数组名取地址是什么?
- 对数组名取地址是什么?
- 数组名a是地址,那么&a是什么?
- 对数组名取地址得到的是什么?
- C++,二维数组与指针,二维数组名是不是首地址?
- C++,二维数组与指针,二维数组名是不是首地址? 之二
- C++,二维数组与指针,二维数组名是不是首地址?
- 二维数组名解析
- 二维数组名本质
- 二维数组名含义
- 二维数组地址解疑
- 二维数组的地址
- 二维数组地址解疑
- 二维数组存储地址
- ANDROID内存优化(大汇总——中)
- Scala学习笔记3 (Functional Programming)
- BlueTooth蓝牙协议规范(四)
- Java中获取完整的URL
- xunsearch同步索引技术
- 二维数组名再取地址是什么
- RGBColor
- 比真机还快的Android模拟器——Genymotion
- 跟踪oracle中sql语句执行过程及相关知识拓展
- 用C++ Builder编程监控打印机队列状态
- Android学习之动画
- 数据结构——素数
- jq中json请求的写法!
- String,StringBuffer与StringBuilder的区别??