注册 登录
编程论坛 C++教室

求教:指向指针的指针与二维数组名

hzdz 发布于 2008-03-24 23:46, 2920 次点击
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的区别,谢谢。。
11 回复
#2
a198705022008-03-24 23:54
pa是指向一维数组的指针,ppa是指向指针的指针.不知道对不对.
#3
aipb20072008-03-25 00:08
二维数组就是数组的数组,而数组名可以解释为该数组类型的指针。

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

这样说不知道你明白不,这个问题比较复杂,意会不可言明。
#4
newyj2008-03-25 10:54
int **ppa=a;改成int **ppa=&a;不知道 对不对
#5
hzdz2008-03-25 12:19
三楼版主,可能我问得比较乱,您说的我都懂

其实我只是想问问

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

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

我刚才写的这些在主楼里都写了,大家可能没看清我的问题,不过还是谢谢二楼和四楼和回答,不过很抱歉,你们回答都错了,找个编译器测试下就会发现
#6
aipb20072008-03-25 13:02
我们知道二维数组名可以从某种程度上理解为指向指针的指针


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

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

[[it] 本帖最后由 aipb2007 于 2008-3-25 13:04 编辑 [/it]]
#7
aipb20072008-03-25 13:30
还不能理解,我再给你个例子:
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]


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好累,当我自己也做个总结,再不明白我就没法了。指针太多,难免笔误,自己耐心看。
#8
hzdz2008-03-25 14:43
呵呵呵呵,谢谢版主了,您真的很耐心。
您说的那些我也懂:)
看来是我陷入自己的一个思维怪圈里了
总结问一句吧:
int**和int(*)[]根本就不是一种类型?//只需回答这句就OK,下面的是我自述
                                   //错误产生原因
"二维数组"这个词最早于六年前在谭浩强的书上看到,此后不管遇 到什么书讲述“数组的数组”(其实c++ primer上也说多维数组),都会潜意识地利用“二维数组”代替之,又由于思维惯性(一维的完全可以拿来当指针使),所以时间长了就混了,怎么也转不过弯来。而您说的那些我全明白,也能正确使用。
#9
flysky1022008-03-25 17:04
我是自学的,对指针总是搞不太懂,虽然很仔细很认真的看了楼主的讲解,但是看完后脑子又乱了,唉。。。。。
#10
sunkaidong2008-03-25 17:36
看看c++primer上面讲的很好。。。。
#11
newyj2008-03-25 20:32
还是 先看 C语言程序设计(谭浩强)版的讲解吧  挺通俗易懂的
再看C++ primer
#12
hzdz2008-03-25 22:39
呵呵,我就是在看C++ PRIMER,怪我读书不细,自己混了概念
谭浩强的书我前面说了,虽然对C的入门来自于此书,但老实说,我不推荐此书
1