一道令我百思不得其解的程序
#include<iostream>
using namespace std;
void main()
{
char (*p)[6];
char a[3][6]={"hello","iam","David"};
for(int i=0;i<3;i++)
{
p=a;
cout<<p[i]<<" ";
cout<<endl;
}
}
为什么要定义:char (*p)[6],而不是定义:char (*p)[3]
希望大家赐教,小弟我谢了!!!
问题点数:40、回复次数:35Top
1 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:18:09 得分 0
为什么要定义:char (*p)[6],而不是定义:char (*p)[3]
--------------------------
原来的数组是char a[3][6].用指针来表示相当于降一维,指针的跨度原来是sizeof(a)/sizeof(char) = 3*6.降低一维以后相当于sizeof(*p) = 6,所以是char(*p)[6]Top
2 楼goodluckyxl(被人遗忘的狗)回复于 2006-03-09 14:19:54 得分 0
(*p)[6]是指向第二维6个字节的指针
这个p的类型char(*)[6] 和 char[][6]匹配
在c中是告警 可以强制转化解决
在c++中估计会报错Top
3 楼jinjiajie(leorio)回复于 2006-03-09 14:21:34 得分 0
.......这个有什么不好理解的?我到是认为要表述清楚这个需要很好的文字功底Top
4 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:24:37 得分 0
(*p)[6]是指向第二维6个字节的指针
这个p的类型char(*)[6] 和 char[][6]匹配
在c中是告警 可以强制转化解决
在c++中估计会报错
-------------------------------------
死狗,为何会报错?C++也匹配的好伐
Top
5 楼goodluckyxl(被人遗忘的狗)回复于 2006-03-09 14:38:55 得分 0
我说 char (*p)[3] = char[][6];这样啊Top
6 楼carry_on(Never lose my passion)回复于 2006-03-09 14:41:21 得分 0
很简单,
char (*p)[3]是表示P指向只分配三个字符空间的指针,肯定存不下hello david
char (*p)[3]与a[][3]差不多,不过char (*p)[3]更灵活
char (*p)[3]中指向每一个数据(单词)在物理地址可能是不连续嘀
a[][3]中存放的数据(单词)在物理地址上是连续的
Top
7 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:42:27 得分 0
char[][6] 哇哈哈哈哈哈哈 动感光波~~~~unknown sizeTop
8 楼carry_on(Never lose my passion)回复于 2006-03-09 14:43:57 得分 0
因为char (*p)[3]只能存两个字符('\0'还占一个字符)
所以肯定要用char (*p)[6]Top
9 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:45:22 得分 0
char (*p)[3]是表示P指向只分配三个字符空间的指针//???????晕了....
同志.....
char array[10000000000][3];
char (*p)[3];
p = array;可以不?.........那个后面的只是第二维的个数嘛~Top
10 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:46:39 得分 0
难道楼上认为char (*p)[3]和char arr[3]一样的....晕...Top
11 楼goodluckyxl(被人遗忘的狗)回复于 2006-03-09 14:48:19 得分 0
char (*p)[3] = char[][6];
是指将 char(*)[6]类型**赋予char(*)[3]类型的**
是表示一类数据的赋值过程 晕 -_-!Top
12 楼carry_on(Never lose my passion)回复于 2006-03-09 14:50:01 得分 0
你误会我嘀意思了Top
13 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:50:51 得分 0
偶知道.....逗你呢.....哈哈哈哈~~~~谁叫你那天在水源讲偶....NND.
实际上.VC 对char (*p)[3] = char[][6];是不通过的....原因不知道是不是C和
C++实现多重数组的结构不一样?嵌套?位移?这个偶一直没去研究,喝喝,老狗讲讲~Top
14 楼carry_on(Never lose my passion)回复于 2006-03-09 14:51:09 得分 0
我是说
-------------------
因为char (*p)[3]只能存两个字符('\0'还占一个字符)
----------------------
P指向的每一个地方只能这样Top
15 楼goodluckyxl(被人遗忘的狗)回复于 2006-03-09 14:52:30 得分 0
不讲Top
16 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:54:57 得分 0
bsTop
17 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:55:07 得分 0
wsTop
18 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 14:55:13 得分 0
ed狗Top
19 楼jinjiajie(leorio)回复于 2006-03-09 15:00:42 得分 0
好多人在等着听呢Top
20 楼hustacsky(见好不收)回复于 2006-03-09 20:05:06 得分 0
char (*p)[6];p指的是指向包含了6个元素的数组的指针。关于char a[3][6]的数组名a,数组a[3]中存放3个有有6个元素的数组,也就是说a[0],a[1],a[2]中都是存放一个数组(有6个元素),a就是a[3]这个数组的指针。a这个指针指向a[0]这个元素,因为a[0]中有6个元素。所以把a赋给p的时候,p需要是char (*p)[6]而不是char (*p)[3]。不知道我说清楚了没有。Top
21 楼hustacsky(见好不收)回复于 2006-03-09 20:08:03 得分 0
上面的赋值以后,所以p[0]就是指向"hello",p[1]就是指向"iam",p[2]就是指向"David"。Top
22 楼citywanderer2005(流浪狗)回复于 2006-03-09 20:35:08 得分 0
我怀疑楼主没有搞清楚char *p[3]和char (*p)[3]的区别。
char *p[3]是指含有三个指向char类型指针的数组。
char (*p)[3]是指向包含了3个元素的数组的指针。
如果把程序换成:
#include<iostream>
using namespace std;
void main()
{
char *p[3];
char a[3][6]={"hello","iam","David"};
for(int i=0;i<3;i++)
{
p[i]=*(a+i);
cout<<p[i]<<" ";
cout<<endl;
}
}
Top
23 楼lxfxw(feng)回复于 2006-03-10 08:54:16 得分 0
char (*p)[6];
我们首先要弄懂这个语句的含义。
1.首先它定义的是一个指针,而不是一个数组(不管数据存放的是什么内容);
2.再次这个指针指向的内容是一个数组,而且这个数组的大小是6;
知道这后,我们就会明白。
由于指针p要指数组char a[3][6]={"hello","iam","David"};故要定义这样的指针char (*p)[6];
Top
24 楼september_29(RSGIS)回复于 2006-03-10 09:03:29 得分 0
哈哈,我准备说的,看来这儿明白人还是不少的,楼上说的对Top
25 楼shalear(张真人)回复于 2006-03-10 09:05:33 得分 0
楼上的citywanderer2005(citywanderer)说得对!Top
26 楼carry_on(Never lose my passion)回复于 2006-03-10 10:11:17 得分 0
楼上的citywanderer2005(citywanderer)很详细Top
27 楼lyongx()回复于 2006-03-10 11:06:42 得分 0
p是指针,指向有六个char元素的數組,则p + 1 <==> (UINT) p + sizeof(char) * 6;Top
28 楼Dream_Lu(璞境)回复于 2006-03-10 15:02:31 得分 0
簡單的講,
char (*p)[6] 是一指針,它指向含有6個字符的組.
char a[3][6] 是三個字符數組(a[0],a[1],a[2]).每個數組個長度是6.
Top
29 楼goodman_2006(无极)回复于 2006-03-10 16:20:21 得分 0
真为中国的软件行业担心, 这个个基本的问题还有这么多人不明白,还好我上面这位仁兄,
终于说对了Top
30 楼goodman_2006(无极)回复于 2006-03-10 16:21:52 得分 0
真为中国的软件行业担心, 这个个基本的问题还有这么多人不明白,还好我上面这位仁兄,
终于说对了Top
31 楼bbbbcccc()回复于 2006-03-10 16:47:07 得分 0
http://valenhua.go3.icpcn.com/Top
32 楼Jiancash(孤鸿铩羽)回复于 2006-03-10 20:44:22 得分 0
唿唿,具然是这么回事哦。Top
33 楼zncn2(embedded system)回复于 2006-03-10 23:06:08 得分 0
h e l l o \0 i a m \0 D a v i d \0
□□□□□□ □□□□□□ □□□□□□
↑ ↑ ↑
a[0][0] a[1][0] a[2][0]
二维数组的真正实现仍是一唯数组
char (*p)[6]是一种指针,这种指针一旦做运算,它的基本运算单位就为6个char
如p++将会使p向后一次性移动6个char长度。
而p[i]也将默认将i乘以6再访问内存。
参考这样一段程序
#include<iostream>
using namespace std;
void main(void)
{
char (*p)[6];
char a[3][6]={"hello","iam","David"};
p=a;
for(int i=0;i<3;i++)
{
cout<<*p<<" ";
cout<<endl;
p++;
}
}Top
34 楼zncn2(embedded system)回复于 2006-03-10 23:07:01 得分 0
我倒,大方块居然又变小方块了,拷下粘到记事本里就正常显示了Top
35 楼wangmuqq88(挥着翅膀的尼姑)回复于 2006-03-12 00:44:30 得分 0
欢迎加群20641933,欢迎大家共同交流.提高!(不怕不会,就怕不学.)Top




