C语言的二级指针,看不懂啊? p=name+i;是对的, printf("%s\n",*p); 也对, 为什么啊? c语言 二级指针问题 这个程序里w=b;换成w=c;为什么p...

作者&投稿:衷舍 (若有异议请与网页底部的电邮联系)
你这个二级指针没有使用到
p=name+i;操作的也是p的一级指针,对一级指针取值能正常取道p的值
你可以试试 *p=name+i; 看看还正确不

C语言二级指针,p=num;是对的, printf("%d \t",**p);也对,为什么啊??~

您好,在函数参数传递中只有值传递。
要看传递的值是什么,如果是一个指针的值那么它就是地址了。否则就是普通的值。
你这里为什么要用二级指针呢?你认为p的值已经是一个地址了所以直接传它的值就可以搞定了。错误就在这里。你想想你为什么还要为p开辟空间。如果p的值已经是你要的地址了那还需要开辟空间吗。所以其实这里要么p的值是null要么是一个随即值,要么是一个地址但不是你要的。那么你把这样的值传过去有什么用呢。 所以这里你要弄清楚我们真正要修改时是哪个的内容。是p所指向的那个内存吗。还是p本身,显然这里要该是p本身的内容。那么你只把p的值传给一个函数这个函数能修改p的内容吗?显然不能了。
所以我们得把p本身的地址传过去。然后才能修改该地址的内容。所以就不得不用二级指针了。

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
",(w+1));那么会输出fwsf,为什么呢?请看前面的解释。如果一定要printf("%?
",*(w+1));,那么这时候其实*(w+1)就是c[0][4]的值,你用%c输出他就出来了。