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

2025-04-19 14:54:02
推荐回答(1个)
回答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输出他就出来了。