读书人

对于《c跟指针》一书的一段话有困惑

发布时间: 2013-01-08 14:02:13 作者: rapoo

对于《c和指针》一书的一段话有困惑
书上说:
在程序中使用字符串常量会生成一个“指向字符的常量指针”,当一个字符串常量出现在一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。
你不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。

那么char str[] = "abc";能成立的原因是不是因为这是初始化而不是赋值?
书上说的应该是:


char str[10];
str = "abc";

是不成立的,因为"abc"是一个指针,而不是这些字符本身。

这里我有点搞不懂,难道真的因为"abc"是指针所以赋值不成功吗?
[解决办法]
char str[] = "abc";
你可以理解为
char str[];
memcpy(str,"abc",4);
某些编译器确实也就是这么干的
准你用等号只是为了方便而已

str = "abc"就是单纯的指针赋值了


[解决办法]
引用:
char str[] = "abc";
你可以理解为
char str[];
memcpy(str,"abc",4);
某些编译器确实也就是这么干的
准你用等号只是为了方便而已

str = "abc"就是单纯的指针赋值了


但是str是一个数组名,可以作为左值吗?
[解决办法]
引用:
楼上回的真快,那str = "abc";赋值不成功的原因是不是真的如书上所说,是因为"abc"是一个指针,而不是这些字符本身?


我觉得可能是因为不能给数组名复制
[解决办法]
char str[10];
str = "abc";


数组名应该代表一个常指针,这个指针指向这个数组的首元素,这个指针的值不能修改,但是指向的内容可以修改。
str = "abc";
这句会修改常指针str的值,所以编译不会通过。
[解决办法]
引用:
char str[] = "abc";
你可以理解为
char str[];
memcpy(str,"abc",4);
某些编译器确实也就是这么干的
准你用等号只是为了方便而已

str = "abc"就是单纯的指针赋值了

应该是
char str[4];
memcpy(str,"abc",4);
[解决办法]
引用:
楼上回的真快,那str = "abc";赋值不成功的原因是不是真的如书上所说,是因为"abc"是一个指针,而不是这些字符本身?

abc是常量字符串。str是数组
另外,数组没法用=来赋值
char str1[] = "abc";
char str2[] = "cba";
str1=str2;
这样也是不行的
[解决办法]
数组名 和 指针的 主要区别之一
指针只是个地址 可以 乱指,
数组名申明后,地址就固定了
[解决办法]
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

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和汇编的对应关系。”
不是一回事!

读书人网 >C++

热点推荐