搞人的二维数组指针,求助!
事情是这样的,我们老师说对于声明如下的
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: 搞人的二维数组指针,求助!
他老眼晕花了。
# 2 Re: 搞人的二维数组指针,求助!
如果要如此写,你写
int** p =(int**)a;
尝试一下。
要不然你说这个a怎么解释,是二维数组第一行的首指针?还是二维数组的首指针?
# 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专家编程上有详细讲解
# 6 Re: 搞人的二维数组指针,求助!
二维数组名不能简单理解成二维的指针,int a[4][5]; a是二维数组的首地址,但它不是一个int **型的指针。
int** p = a;这样赋值是错误的,用指针对二维数组的操作应该参考用指针数组(int * p[4])或者或者行指针((int *)p[4])的方式
# 7 Re: 搞人的二维数组指针,求助!
同意上面的,a是二维数组的首地址,而P是指向指针的指针,不能这样赋值~~~
# 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) ( ) 信
# 11 Re: 搞人的二维数组指针,求助!
大家还有没有什么看法啊?
ywhs at 2005-5-18 12:39:31 >

# 12 Re: 搞人的二维数组指针,求助!
int **用于表示二维数组的缺点在于指针的间隔无法确定,因此,虽然,int**可以描述二维数组,但地址并不是“自动”的一次性赋给的,作为定长多维数组,在很多时候可以被当作一位数组直接操作,然而,多级指针却绝不可以这样,这是数组与指针最本质的区别。如果一定要问int**与什么数组形式相对的话,int** = int[][],而int[][]与int[5][3]完全是两回事。
# 13 Re: 搞人的二维数组指针,求助!
nod
多位数组在意义上和指针完全不是一回事了
指针是一个间接指向的过程
但是多位数组,确实一个定点计算的问题
作为参数传递的时候,也不能如此直接传递
必须强制转化为一维数组,然后给出各个原始纬度的大小,再通过计算偏移得到原始数据
# 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;
汇编代码都不一样...
# 15 Re: 搞人的二维数组指针,求助!
这么用
int a[4][5];
int** p = &a[0];
其实区别就在二维数组的空间为连续,而二维指针申请的堆空间不是。
# 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
这个是我针对我的例子反汇编的结果,认为可以相互转换的朋友,可以看看
# 17 Re: 搞人的二维数组指针,求助!
学习。。。。。。。。。。。。。
# 18 Re: 搞人的二维数组指针,求助!
二维数组名不能简单理解成二维的指针,int a[4][5]; a是二维数组的首地址,也是数组第一行的首地址(在数值上是一样的),但它不完全等同于一个int **型的指针。
int** p = a;这样赋值是可以的,多维数组就只能用多层的指针,(使用数组名除外)。至少这点在TC中是完全正确的,也许VC有不同的规定!!
# 19 Re: 搞人的二维数组指针,求助!
可以用,不代表会正确,下面这个代码在C中都没有问题:
char c;
int* p;
c = 'a'
p = &c;
*p = 65535;
赋值确实可以,但是执行结果不会正确...
# 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];
# 22 Re: 搞人的二维数组指针,求助!
int a[4][5];这种型式的的确确会在“很多时候可以被当作一位数组直接操作”。但最好不要这样做,我觉得不安全。
# 23 Re: 搞人的二维数组指针,求助!
强烈感谢大家的帮助!
谢谢!
学了很多......
:-)
ywhs at 2005-5-31 18:29:31 >
