新手指针问题,望高手指点

sandals 2011-11-01 08:58:49
代码很简单,如下:


#include <stdio.h>

int main(void){
char *p1 = "test";
char **p2 = &p1;
char *p3 = (char *)&p1;

printf("%s, %s\n", *p2, (char*)(*p3));

return 0;
}


这段代码会报错。所以想请问:

1. p2和p3的值是一样的,区别在哪?
2. 用*p2可以得到p1的值("test"), 为什么不能用 (char*)(*p3)来得到 p1的值?

还望高手指点一下?非常感谢。
...全文
99 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-11-02
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
xiaozhiwei 2011-11-02
  • 打赏
  • 举报
回复
printf("%s, %s\n", *p2, *((char**)p3));
mengmingtao 2011-11-01
  • 打赏
  • 举报
回复
2楼正解~
柯本 2011-11-01
  • 打赏
  • 举报
回复
p2是一个二维指针,它的内容为指针,有4个字节
p3是一个字符指针,它的内容为字符,只有1个字节
(char*)(*p3)结果是将(*p3)中的1个字符赋给了(char *)指针,当然要出错了

改这样就可以了:
printf("%s, %s\n", *p2, (char*)(*(int *)(p3)));
mengmingtao 2011-11-01
  • 打赏
  • 举报
回复
先说一下它们的关系吧:
[p2]---> [p1] --->["test"]
[p3]---> [p1] --->["test"]
1. p2和p3物理上代表的内容是一样的,存放的都是p1这个变量的地址。而p1这个变量本身存放的是一个字符串的地址。不同就在解释了,p2我们知道存放的这个东东是一个地址的地址,p3里则解释为存放的东东是一个字符的地址。
2. (*p3)可以得到p1的地址。但是这里只表示它是一个整数,可以用*((char*)(*p3))获取p1.

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧