给位请教下一个指针和数组的问题
int a[0][0];
int (*p)[3];
p=&a[0][0];p=a[0];为什么不正确??而
p=&a[0]却是正确的?不是说a[0]和a都是表示数组的首地址吗?还有&a[0][0]不能表示它的首地址吗?
p=a没问题这我能理解
谢谢了
问题点数:50、回复次数:19Top
1 楼yl888(yanglei_tc)回复于 2004-05-02 00:03:25 得分 0
你定义的 p 是指向数组的指针,它的每个元数都应该是个地址;
int a[0][0] 能这么定义吗?
Top
2 楼antijpn(antijpn)回复于 2004-05-02 00:07:29 得分 0
p是指向数组的指针,&a[0][0]是一个指向int型数据的指针,当然是不行的了
而a[0]是一个一维数组,当然也就不能赋给p了
而&a[0]是一个一维数组的地址,自然也就可以了Top
3 楼antijpn(antijpn)回复于 2004-05-02 00:08:38 得分 0
其实上面的两个代码在C里面都能通过,而在C++里面,这些代码都不能通过Top
4 楼mistysunlight(为裤叉奋斗)回复于 2004-05-02 00:50:59 得分 0
int a[0][0];
int (*p)[3];
p=&a[0][0];p=a[0];为什么不正确??而
p=&a[0]却是正确的?不是说a[0]和a都是表示数组的首地址吗?还有&a[0][0]不能表示它的首地址吗?
---------------------
以上是引用!
---------------------
不过int a[0][0];不知道作者是什么意思,如果是初始化还可以,如果是定义数组就错了!
数组的首地址:p--> a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
p=&a[0][0];p=a[0];
p=&a[*][*]是a[*][*]中数据的地址!如果你取出其地址的话,结果可想而知是错!
p=a[0]就更不对了! 这里出现的是类型不匹配!前面是指针,后面是整型,能行吗?当然不行!
而p=&a[0]却是正确的,因为:
在a[0][0] a[0][1] a[0][2]中 它的行地址是&a[0]而刚好也是数组的首地址!
其他 如:&a[1], &a[2]只是它所在行的首地址而已!不是数组的首地址!Top
5 楼qyet(少年心气)回复于 2004-05-02 00:55:00 得分 0
在C++中,有多种机制用来说明2维数组,但其中的很多都要求在编译时明确每一维的大小。所以要避免在参数传递时,必须指定高维大小的麻烦,一般都是用动态空间分配。
如这样写:
int **a = new int * [5];
for(int i = 0 ; i < 5 ; i++)
int a[i] = new int [5];
则可以看出,a[i]是第i行的首地址(第一个元素),而a本身杂是一个指向指针的指针.....
所以p=&a[0][0]应该这样写:int *p = &a[0][0];
Top
6 楼cngdzhang()回复于 2004-05-02 20:35:18 得分 50
确实
a[0]和a还有&a[0][0]
都是表示数组的首地址
但是这只是表明它们的值是相同的,但是含义不一样
举个类似的例子:
long l=100;
int *ps=(int *)&l;
char *pc=(char *pc)&l;
&l,ps,pc的值都相同,
但是表示的意思都不一样
a代表整个数组的首地址,
a[0]表示第一个一维数组的首地址(二维数组是由多个一维数组组成的)
&a[0][0]表示第一个元素的首地址
Top
7 楼geyufly(geyu)回复于 2004-05-03 17:58:28 得分 0
不好意思大错了
是
int a[3][3]={1,2,3,4,5,6}Top
8 楼qyet(少年心气)回复于 2004-05-04 22:23:59 得分 0
一样的道理啊Top
9 楼carambo(单叶草--(***实干才有好运***))回复于 2004-05-04 23:24:31 得分 0
你定义 int a[0][0];犯了个大错.程序应该输出的是不确定的值.Top
10 楼hewittlee(只爱C++)回复于 2004-05-05 16:35:26 得分 0
a代表整个数组的首地址,
a[0]表示第一个一维数组的首地址(二维数组是由多个一维数组组成的)
&a[0][0]表示第一个元素的首地址
Top
11 楼hewittlee(只爱C++)回复于 2004-05-05 16:38:52 得分 0
a代表整个数组的首地址,
a[0]表示第一个一维数组的首地址(二维数组是由多个一维数组组成的)
&a[0][0]表示第一个元素的首地址
而你定义p是指向一维数祖的首地址,
int *p 可以指向&a[0][0],&a[0]Top
12 楼57808475(日中天)回复于 2004-05-05 20:16:59 得分 0
a[0][0]有什么用?Top
13 楼connie2003(川川)回复于 2004-05-05 21:02:22 得分 0
一句话,左右类型不匹配Top
14 楼xiaozhong(子陵)回复于 2004-05-05 22:11:02 得分 0
你定义的p是行指针,只有p=&a[0],或p=a,p=a+1才是正确的,详细的可参见潭浩强的c程序设计教程Top
15 楼Alextrue(博爱)回复于 2004-05-05 23:45:33 得分 0
大家有没有看到,作者说打错了:
“不好意思大错了
是
int a[3][3]={1,2,3,4,5,6}”
好像他的更正也不对呀。
一个3行*3列的二维数初始化是这样的:
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
Top
16 楼weixiaohua(我爱Delphi)回复于 2004-05-06 00:10:49 得分 0
a[0]是首地址的实际值!
&a[0]才是首地址!Top
17 楼zhouqingyuan(浪帆)回复于 2004-05-06 00:31:59 得分 0
弄懂这些数据是怎么存储的,看存储的东西是否匹配,就应该可以明白了。Top
18 楼xjl999(再生)回复于 2004-05-06 10:57:47 得分 0
int **b ->a
int *b ->a[0]
int b->a[0][0]
所以
p = a 或者p = &a[0]
虽然 a,a[0],&a[0][0]是同一个值
其中a 和 a[0]只是右值,没有实际的存储单元Top
19 楼Carl2000(★风流子)回复于 2004-05-06 19:37:13 得分 0
dingTop




