字符串指针的一些疑惑

一秒一次郎 2012-07-02 09:08:46
小弟最近被字符串指针搞晕了

CString *a,b="abc";

*a="abc"; //错误

a="abc" //错误

*a+=b; //错误


char *a;

*a="abc"; //错误

a="abc"; //可以



这个能有人给讲讲是肿么回事么,晕了直接都
...全文
141 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-07-02
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!
lostfive 2012-07-02
  • 打赏
  • 举报
回复
char *a;//是指你定义了一个指向char类型指针

*a="abc"; //错误

a是指向char类型的指针也就意味着*a的类型是char,错误就好比是char b; b="abc";

a="abc"; //可以
a是指向char类型的指针,把字符串地址赋给a也就是把字符串首地址赋给了a
也就等价于 *a='a';*(a+1)='b';*(a+2)='c';*(a+3)='\0';
至于CString你如果把定义搞清的话 解释同上
你可以把定义发出来
不过解释应该是类似的


gotojyh 2012-07-02
  • 打赏
  • 举报
回复
基本上错误是没有给指针申请内存

CString *a=new CString;
char *a=new char[10];
strncpy(a,"abc",10);
一叶之舟 2012-07-02
  • 打赏
  • 举报
回复
CString *a,b="abc";

*a="abc"; //错误a相个未初始化的指针,这样肯定错了。

a="abc" //错误,同上

*a+=b; //错误同上


char *a;

*a="abc"; //错误同上

a="abc"; //可以,给指针初始化正确。
jiandingzhe 2012-07-02
  • 打赏
  • 举报
回复
从没用过微软的东西
庄鱼 2012-07-02
  • 打赏
  • 举报
回复
确切地说,string应描述为字符串数据管理类型,属于结构定义类型;字符串属于隐式转换基本数据类型
庄鱼 2012-07-02
  • 打赏
  • 举报
回复
楼主犯了个概念错误:string为字符串数据类型,而不是字符串!
CString是类似string的一种数据类型,同样也不是字符串。
class的指针类型必须要有源数据,楼主的问题在于CString *a缺乏数据源,*a="abc"导致存储单元不确定错误,a="abc"则导致数据类型引用不一致错误,*a+=b同样是存储单元不确定错误。
如果这样写就可以:a = &b; *a="abc"; 或 a = new CString();*a="abc";
char *a;为字符串,也叫字符串指针(沿袭早期C语言习惯,在C++里应称之为字符串指针)。*a="abc";引发类型不一致错误:*a为字符单元,而非字符串。
ohayou 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 zhao4zhong1 的回复:

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
……
[/Quote]
你以为人家的星星是怎么来的
庄鱼 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao4zhong1 的回复:]

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C……
[/Quote]
这种复制/粘贴的帖子不会也罢,除非你自己也不知道原因

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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