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

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 能进行如此深入的思考,进步会很快的,希望早日有所成就!
提问者评价
谢谢你的回答,很有用,借你吉言,共同进步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值