字符串常量赋值给整型变量?
#include <stdio.h>
int main(void)
{
int a;
a = "hello world!";
printf("%s\n", a);
return 0;
}
这段代码可以运行正确结果。
但不明白:字符串常量可以赋给整型变量,且该变量用%s输出还可以得到正确结果?。请明白的给解释下,谢谢!
[解决办法]
只能说是编译器的不同
可以理解为
char *s=“....";
a = s;s为字符串的首地址 指针大小是4字节和int保证他不失真
再进行输出那效果就一样了
我这边是不行的 最好不要去理解这问题 按标准来说是错的
[解决办法]
a = "hello world!";
等于 a = (int)"hello world!"
对于32位机器来说,指针的值是个32位的值,int也是个32位的值(vs系列编译器如此),所以从内存区域来看,没区别的,
另外,楼上有人所说的,a = (int)"hell" 和 a = 'hell'是两码事
[解决办法]
不是把字符串存到了a里,而是把指向字符串的指针存到了a里
printf("%s\n", a);语句里,%s的输出要求提供一个字符串指针,而a里现在正好就有一个。所以,你就看到了那个结果。
对于32位机器的汇编语言来说,指针和int的存放方式没什么差别。
[解决办法]
是把地址存入到a了
[解决办法]
额,看到上面的人们回答问题,我表示很遗憾!
(1)
a = "hello world!";//在VC6.0下,不能够编译成功,何谈运行
(2)大家可以测试一下这个例子
- C/C++ code
#include <stdio.h>int main(void){ int a; int b; a = (int)"hello world!"; char *p="hello world!"; printf("%x,%x\n",a,(int)p); printf("%s\n", a); return 0;}
[解决办法]
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
不要写连自己也预测不了结果的代码!