c语言 二级指针问题 这个程序里w=b;换成w=c;为什么printf("%s\n",*(w+1));这一句就不行

#include<stdio.h>
main()
{
char* b[2]={"fewfwef","fwfwfwq"};
char c[2][10]={"fwfwfwsf","dwgerge"};
char **w;
w=b;
printf("%s\n",*(w+1));
}

w=c;这个用法本来就不建议的,即使编译可以通过。我用最浅显的说法来解释就是,两者是不同类型来的,如果你是初学者,那么记住二维数组不是二级指针,二维数组叫行指针,如果你想深入点理解可以往下看,计算机对你的操作解释如下:
1)w=c,那么把c[0][0]的地址写入二级指针w中。
2)w+1,对于这句,因为w是char**类型,所以执行的是把w中存的地址,也就是刚才被写入c[0][0]的地址+4,为什么是加4?因为char**本身应该存的是char*类型,+1操作被解释为偏移一个char*的大小,我们知道指针在计算机中是4字节的,所以这时候保存的是c[0][4]的地址。
3)*(w+1)这句怎么解释,我们知道*是把对应数据当做地址,并进行寻址求值,用汇编的说法就类似mov ax,[bx].而这时候w+1是解释为c[0][4]的地址,如果你要用%s输出的话,那么就不要寻址求值,直接printf("%s\n",(w+1));那么会输出fwsf,为什么呢?请看前面的解释。如果一定要printf("%?\n",*(w+1));,那么这时候其实*(w+1)就是c[0][4]的值,你用%c输出他就出来了。追问

那我要 通过w输出c[2][10]中的 c[2][4]"dwgerge"该怎么写呢

追答

1)c[2][4]是非法的,因为char c[2][10]的下标是从0~1的,我理解为c[1][0]的字符串]"dwgerge"
2)如果w=c,也就是用二级指针去指向c,那么printf("%s\n",(((char*)w)+10));,首先,将w强扭为char*类型,那么他的加1操作就变成一个字节的移位操作。结果输出为字符串dwgerge
3)用一个一维指针指向c,例如 char *w1=c;实际上在物理空间上c是连续的,直接
printf ("%s",w1+10);就出来了
4)用行指针的形式,char (*w2)[10];记得要加括号,然后printf("%s\n",w2[1]);或者
printf("%s\n",w2+1);就出来了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-06
楼上说的比较繁琐,在根本问题上还少些东西。
其实,根本原因,是b和c在内存表现上是不同的。
b 在存储上和w一样,是二维指针模式,用两个地址存储了一维指针(数组)的地址,占用空间为2int+实际使用char+2个结束符char。
c 在存储上,和一维数组d[20]没有任何区别!只是申请了20个char的地址,没有用于存储一维指针首地址的空间!
存储结构完全不同的两个变量,当然不能用相同的指针地址计算。
通常上我们将,一维char数组可以当做一维指针使用。但二维数组和二维指针,完全是两码事,不能混为一谈(当然,二维指针中的一维,依然是一维指针,我们可以将数组作为其成员)。追问

那我要输出b[2]中的"fwfwfwq"该怎么写呢

本回答被网友采纳
相似回答