二维数组名再取地址是什么

来源:互联网 发布: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