| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2912 人关注过本帖
标题:求教:指向指针的指针与二维数组名
只看楼主 加入收藏
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
 问题点数:0 回复次数:11 
求教:指向指针的指针与二维数组名
int a[2][2]={1,2,3,4};

int (*pa)[2]=a;//这样可以
int **ppa=a;//这就出错
int *b=&a[0][0];
ppa=&b;//这样编译也没问题,但是想往出打东西却出错,首先排除越界问题

但是:
cout<<*(*(a+i)+j)却是可以把数组打出来的
想问下上面pa和ppa的区别,谢谢。。
搜索更多相关主题的帖子: 指针 
2008-03-24 23:46
a19870502
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2007-10-31
收藏
得分:0 
pa是指向一维数组的指针,ppa是指向指针的指针.不知道对不对.
2008-03-24 23:54
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
二维数组就是数组的数组,而数组名可以解释为该数组类型的指针。

你把上面的这句话理解透彻就可以解释你的问题了。
比如int a[5][10]
这时a的类型一个int[10]数组的数组,长度为5.
所以int (*p)[10]表示一个指针指向一个长度为10的数组。

这样说不知道你明白不,这个问题比较复杂,意会不可言明。

Fight  to win  or  die...
2008-03-25 00:08
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
int **ppa=a;改成int **ppa=&a;不知道 对不对
2008-03-25 10:54
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
得分:0 
三楼版主,可能我问得比较乱,您说的我都懂

其实我只是想问问

int **ppa;
int am[][];
这里am和ppa的区别在哪
我们知道二维数组名可以从某种程度上理解为指向指针的指针,从而通过两次解引用获得其任一子成员的值,但am又不是普通的指向指针的指针,因为ppa=am会报错.
只有在int (*pam)[];,然后pam=am才成立。

我想说的是这里的pam和ppa区别在哪里?

我刚才写的这些在主楼里都写了,大家可能没看清我的问题,不过还是谢谢二楼和四楼和回答,不过很抱歉,你们回答都错了,找个编译器测试下就会发现
2008-03-25 12:19
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
我们知道二维数组名可以从某种程度上理解为指向指针的指针


这里就错了啊,你看我写的那句话,没有2维数组,更不能把2维数组当指针的指针。

所谓2维数组其实就是数组的数组,而仅又数组名可以解释为指针,所以二维数组名解释维指向数组的指针。
你不能把这个规则进行嵌套,如果迭代一次,就是int **p = am,显然,这是错的。

[[it] 本帖最后由 aipb2007 于 2008-3-25 13:04 编辑 [/it]]

Fight  to win  or  die...
2008-03-25 13:02
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
还不能理解,我再给你个例子:
int a[2][2] = {1,2,3,4}
在内存中,a是被连续存放的 1 2 3 4,其中一个int占4个byte
之所以可以用a[1][1]引用到4,是(a+2*1+1),而正是int告诉了a应该偏移4个byte,而2是第二维的大小。所以才能正确索引;

现在int **p那么p[1][1]的访问形式是*(*(p+1)+1);
如果p = new int*[2];p[0] = new int[2];p[1] = new int[2];
ok,p指向new int*[2]的首地址,p+1偏移1个byte(int*占一个byte),在解引用*(p+1)根据p[1] = new int[2],得到一个指向大小为2的int数组,*(p+1)+1
偏移4个byte,再解引用,得到期望的p[1][1];

但是如果 int (*p)[2] = a;那么p知道自己可以是指向一个大小为2的int数组,所以p[1][1],p+1得到p的偏移是2*4byte,解引用得到一个int型指针,指向大小为2的数组的首地址,在*(p+1)+1,偏移4个byte,再解引用,得到p[1][1]


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好累,当我自己也做个总结,再不明白我就没法了。指针太多,难免笔误,自己耐心看。

Fight  to win  or  die...
2008-03-25 13:30
hzdz
Rank: 2
等 级:论坛游民
帖 子:46
专家分:10
注 册:2007-2-3
收藏
得分:0 
呵呵呵呵,谢谢版主了,您真的很耐心。
您说的那些我也懂:)
看来是我陷入自己的一个思维怪圈里了
总结问一句吧:
int**和int(*)[]根本就不是一种类型?//只需回答这句就OK,下面的是我自述
                                   //错误产生原因
"二维数组"这个词最早于六年前在谭浩强的书上看到,此后不管遇 到什么书讲述“数组的数组”(其实c++ primer上也说多维数组),都会潜意识地利用“二维数组”代替之,又由于思维惯性(一维的完全可以拿来当指针使),所以时间长了就混了,怎么也转不过弯来。而您说的那些我全明白,也能正确使用。
2008-03-25 14:43
flysky102
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2007-12-26
收藏
得分:0 
我是自学的,对指针总是搞不太懂,虽然很仔细很认真的看了楼主的讲解,但是看完后脑子又乱了,唉。。。。。

I think I could do better.
2008-03-25 17:04
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
看看c++primer上面讲的很好。。。。

学习需要安静。。海盗要重新来过。。
2008-03-25 17:36
快速回复:求教:指向指针的指针与二维数组名
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.063384 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved