Sign-up....

搞人的二维数组指针,求助!

事情是这样的,我们老师说对于声明如下的

int a[4][5];

的a这个二维数组,它的类型实际上是int**,

但是我在编程的时候试,写了下面的代码:

int a[4][5];

int** p = a;

VC中说不能将int [4][5]转化成int**,

BCB和Dev-C++中说不能将int (*)[5]转化成int**,

所以我想应该是老师弄错了,实际上一个二维数组的类型是int (*)[n](其中n是第二维的维数),

int (*p)[5] = a;

就行了。

我跟我们老师说,她坚持说int**是对的。

大家怎么看啊?我都有点晕了。

[286 byte] By [msdn] at [2007-8-14 20:05:16]
# 1 Re: 搞人的二维数组指针,求助!

他老眼晕花了。

youyuan1980 at 2005-5-17 19:09:18 >
# 2 Re: 搞人的二维数组指针,求助!

如果要如此写,你写

int** p =(int**)a;

尝试一下。

要不然你说这个a怎么解释,是二维数组第一行的首指针?还是二维数组的首指针?

goodboy1881 at 2005-5-17 19:17:12 >
# 3 Re: 搞人的二维数组指针,求助!

她说二位数组是int**型的,但是赋值指针的时候和类型又是不一样的,两者是有区别的。

所以我感到很奇怪,为什么赋值的时候不一样的,还要说二位数组是int**,

要不然为什么不能用一个int**的指针指向它呢?这不是明显的赋值不相容吗?

ywhs at 2005-5-17 19:19:47 >
# 4 Re: 搞人的二维数组指针,求助!

To goodboy1881:

你说可以用的,那a是什么类型的啊?

ywhs at 2005-5-17 19:31:07 >
# 5 Re: 搞人的二维数组指针,求助!

指针!=数组名

int a[4][5]它的类型绝对不是int**

只是函数在传参数的时候会将数组转化为指针

具体的查书了,c专家编程上有详细讲解

SaiRose at 2005-5-17 19:40:58 >
# 6 Re: 搞人的二维数组指针,求助!

二维数组名不能简单理解成二维的指针,int a[4][5]; a是二维数组的首地址,但它不是一个int **型的指针。

int** p = a;这样赋值是错误的,用指针对二维数组的操作应该参考用指针数组(int * p[4])或者或者行指针((int *)p[4])的方式

qingyuan18 at 2005-5-17 20:28:11 >
# 7 Re: 搞人的二维数组指针,求助!

同意上面的,a是二维数组的首地址,而P是指向指针的指针,不能这样赋值~~~

anyy0929 at 2005-5-17 20:44:38 >
# 8 Re: 搞人的二维数组指针,求助!

我想问的是int a[5][3]中a的类型是int**吗?郁闷中……

ywhs at 2005-5-17 20:46:30 >
# 9 Re: 搞人的二维数组指针,求助!

To SaiRose(Learning......):

那本书里面只讲说指针与数组不同,好像没有讲我所说的啊~......能不能说一下在哪啊?

ywhs at 2005-5-17 21:38:00 >
# 10 Re: 搞人的二维数组指针,求助!

二维数组名不能简单理解成二维的指针,int a[4][5]; a是二维数组的首地址,但它不是一个int **型的指针。

int** p = a;这样赋值是错误的,用指针对二维数组的操作应该参考用指针数组(int * p[4])或者或者行指针((int *)p[4])的方式

同意qingyuan18(zealot_tang) ( ) 信

maxuming914a1 at 2005-5-17 22:11:41 >
# 11 Re: 搞人的二维数组指针,求助!

大家还有没有什么看法啊?

ywhs at 2005-5-18 12:39:31 >
# 12 Re: 搞人的二维数组指针,求助!

int **用于表示二维数组的缺点在于指针的间隔无法确定,因此,虽然,int**可以描述二维数组,但地址并不是“自动”的一次性赋给的,作为定长多维数组,在很多时候可以被当作一位数组直接操作,然而,多级指针却绝不可以这样,这是数组与指针最本质的区别。如果一定要问int**与什么数组形式相对的话,int** = int[][],而int[][]与int[5][3]完全是两回事。

FreeFice at 2005-5-18 22:01:09 >
# 13 Re: 搞人的二维数组指针,求助!

nod

多位数组在意义上和指针完全不是一回事了

指针是一个间接指向的过程

但是多位数组,确实一个定点计算的问题

作为参数传递的时候,也不能如此直接传递

必须强制转化为一维数组,然后给出各个原始纬度的大小,再通过计算偏移得到原始数据

nicknide at 2005-5-18 23:39:54 >
# 14 Re: 搞人的二维数组指针,求助!

给个例子

int a[2][3];

int** p;

p = new int*[2];

p[0] = new int[3];

p[1] = new int[3];

然后你反汇编这段代码:

a[1][2] = 5;

p[1][2] = 5;

汇编代码都不一样...

nicknide at 2005-5-18 23:42:47 >
# 15 Re: 搞人的二维数组指针,求助!

这么用

int a[4][5];

int** p = &a[0];

其实区别就在二维数组的空间为连续,而二维指针申请的堆空间不是。

rendaduiyan at 2005-5-18 23:53:58 >
# 16 Re: 搞人的二维数组指针,求助!

汗一个楼上,你这么用的话,程序9成9会出现问题的。

a[1][2] = 5;

00416AFE mov dword ptr [ebp-8],5

p[1][2] = 5;

00416B05 mov eax,dword ptr

00416B08 mov ecx,dword ptr [eax+4]

00416B0B mov dword ptr [ecx+8],5

这个是我针对我的例子反汇编的结果,认为可以相互转换的朋友,可以看看

nicknide at 2005-5-19 1:55:14 >
# 17 Re: 搞人的二维数组指针,求助!

学习。。。。。。。。。。。。。

MagicCarmack at 2005-5-19 4:13:21 >
# 18 Re: 搞人的二维数组指针,求助!

二维数组名不能简单理解成二维的指针,int a[4][5]; a是二维数组的首地址,也是数组第一行的首地址(在数值上是一样的),但它不完全等同于一个int **型的指针。

int** p = a;这样赋值是可以的,多维数组就只能用多层的指针,(使用数组名除外)。至少这点在TC中是完全正确的,也许VC有不同的规定!!

jixingzhong at 2005-5-19 11:22:38 >
# 19 Re: 搞人的二维数组指针,求助!

可以用,不代表会正确,下面这个代码在C中都没有问题:

char c;

int* p;

c = 'a'

p = &c;

*p = 65535;

赋值确实可以,但是执行结果不会正确...

nicknide at 2005-5-20 0:06:48 >
# 20 Re: 搞人的二维数组指针,求助!

To FreeFice(庄鱼):

int[][]是什么意思?为什么int** == int[][]?

int[][]与int[5][4]分别表达什么?有什么区别?

ywhs at 2005-5-25 18:12:16 >
# 21 Re: 搞人的二维数组指针,求助!

强烈同意  FreeFice(庄鱼) :

偑服 FreeFice(庄鱼) 对多维数组的理解。

其实,int a[4][5];这种型式中,a 的类型为 :int (* )[5];

是的,编译器会把最后一维的数量做为类型的一种参考,更严格一点说的话,应该是:int (* const )[5];

xuwedo2003 at 2005-5-25 19:01:21 >
# 22 Re: 搞人的二维数组指针,求助!

int a[4][5];这种型式的的确确会在“很多时候可以被当作一位数组直接操作”。但最好不要这样做,我觉得不安全。

xuwedo2003 at 2005-5-25 19:03:16 >
# 23 Re: 搞人的二维数组指针,求助!

强烈感谢大家的帮助!

谢谢!

学了很多......

:-)

ywhs at 2005-5-31 18:29:31 >

C/C++

All Classified