关于指针的指针和二维数组的疑问
书上说,二维数组名就是指针的指针。数组名是指向二维数组的行地址存储空间的首地址,也就是指针数组。那么:
int a[3][3] = {1,2,3,4,5,6,7,8,9};
a -> a[0] a[1] a[2]
a[0]-> 1 2 3
a[1]-> 4 5 6
a[2]-> 7 8 9
如果:
int **p;
p = a;
为什么P就能等价于a了呢?我真的是想不明白。请指教。
问题点数:20、回复次数:12Top
1 楼bugebear3(bug)回复于 2005-09-08 16:01:51 得分 0
二维数组名就是指针的指针,
而p是int **,当然可以p = a;了Top
2 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2005-09-08 16:05:49 得分 0
P与A的区别在于,一个是常量,一个是变量
Top
3 楼lxb365(to be loved)回复于 2005-09-08 16:15:06 得分 0
*p和一维数组a的关系,跟**p和二维数组的关系差不多
既然
int a[];
int *p;
p=a; 成立,
那么
int a[][];
int **p;
p=a; 也成立
Top
4 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-09-08 16:45:05 得分 0
楼主是错的。
那个p跟a是不同的,类型不一样,直接p=a的话肯定会产生warning:suspicous pointer conversion的。
p得这样定义:int (*p)[3],才能p=a;Top
5 楼snowbirdfly(专心搞好嵌入式~~~)回复于 2005-09-08 17:00:11 得分 0
是啊~
支持楼上说法~~
还有一点是
a为常量,p为指针变量~~~
不能对a进行加减运算~~
而p可以~~~
Top
6 楼copygirl(wa!)回复于 2005-09-08 17:58:00 得分 10
int aa[2][2]={1,2,3,4};
int *p;
因为二维数组是线性结构,可以把它看成一维数组,aa[4]={1,2,3,4};
这时,p=aa,p指向的是aa中的第一个元素,所以*p=1;
同理,*(p+1)=2;,*(p+2)=3;,*(p+3)=4;
如果想告诉编译器,p指向的空间是一个二维空间,则可以构造一个二维指针数组,每个指针指向二维数组中的一个元素:int *p[2][2](不带括号相当于 int *(p[2][2]) ),此时,用p[0][0]=aa,表示将aa数组中的第一个元素的地址赋给p指针数组中的第一个指针,于是,打印*p[0][0],就可以打印出1Top
7 楼daniel_zwn(小兵)回复于 2005-09-08 18:41:33 得分 0
main()
{
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int *p;
p=a;
printf("%d",*p);
}
事实证明二维数组只是一维线性表,例子中将打印1;支持楼上.Top
8 楼bugebear3(bug)回复于 2005-09-08 19:27:05 得分 0
楼上的不对哟:
error C2440: '=' : cannot convert from 'int [3][3]' to 'int *'Top
9 楼lxk_cool()回复于 2005-09-08 23:12:07 得分 0
应该是p=&a[0][0]吧.....Top
10 楼gzlyb(冰风)回复于 2005-09-08 23:21:44 得分 0
指针和数组名的调用方法都不一样
指针是要先取得指针值,再根据这个值去访问所指向的变量值
而数组名是直接取变量值
Top
11 楼daniel_zwn(小兵)回复于 2005-09-11 22:43:54 得分 0
我用TC运行的,程序没有问题Top
12 楼Basin_Fish(心碎de青蛙)回复于 2005-09-11 23:06:00 得分 10
to copygirl(wa!)
为何要定义个二维的指针数组,定义一个一维的指针数组对二维数组进行行的操作
int *a[3];
int aa[3][5];
a[0]=aa[0][0];
a[1]=aa[1][0];
a[2]=aa[2][0];
a[0]->aa[0][0] aa[0][1] aa[0][2] aa[0][3] aa[0][4]
a[1]->aa[1][0].....
a[2]->aa[2][0]
Top




