C语言里sizeof('a')是多少?
请高手解答下面代码注释中的疑问
// 编译环境mingw5
#include <stdio.h>
int main(int argc, char *argv[])
{
char *p1 = 'a';// 1.这样能取到地址码? 为什么gcc有警告:warning: initialization makes pointer from integer without a cast
char *p2 = 'b';
char *p3 = "hello";// 2.这样取地址应该没问题吧?
char *p4 = "world";
printf("%d %d ", p1, p2);
printf("%d %d ", p3, p4);
printf("%d ", sizeof('h'));//3.为什么结果是4 ???
printf("%d ", sizeof("hello"));
return 0;
}
[最优解释]
1 不能
'a'意为“字符a的ASCII码”,它的类型是int,数值是97(或者96,记不清了)
这条语句的意思是,定义一个字符指针p1,它指向地址空间中绝对地址为97的内存。
2 可以
直接写在代码中的字符串,在编译时就被编译为这个字符串存放在常量区的地址。
这条语句的意思是,在常量区放置一个字符串"hello",并将它的地址赋给字符指针p3;
3 上面说过了'a'的类型,sizeof(int)==4
[其他解释]
1, 单个字符,编译后直接变成对应的整数(编码)
2,字符串常量,没问题
3,同1,gcc翻成一个int,这里int的大小为4
[其他解释]
#include <stdio.h>
int main(int argc, char *argv[])
{
char *p1 = 'a'; // 这样是 直接 将 a的 assic 97 作为地址 赋给 p1
char *p2 = 'b';
char *p3 = "hello"; // 这样是将 字符串首地址 赋给p4
char *p4 = "world";
printf("%d %d ", p1, p2);
printf("%d %d ", p3, p4);
printf("%d ", sizeof('h'));// h的 assic 值 作为 int 型 所以4字节
printf("%d ", sizeof("hello"));
return 0;
}
[其他解释]
1:这个取不到a的地址,'a'是ASCII值(char 类型本质上就是整型),相当于整数 97,所以会弹出这样的警告。此时p1指向0x61处。
2:这样取地址没有问题。此时"hello"存储在静态只读区,p3指向"hello"字符串的首地址处。
3:同1,‘h’就是一个整形值,int类型占4个字节。
[其他解释]
上面的格式乱了,请看这里:
请高手解答下面代码注释中的疑问
#include <stdio.h>
int main(int argc, char *argv[])
{
char *p1 = 'a';// 1.这样能取到地址码? 为什么gcc有警告:warning: initialization makes pointer from integer without a cast
char *p2 = 'b';
char *p3 = "hello";// 2.这样取地址应该没问题吧?
char *p4 = "world";
printf("%d %d ", p1, p2);
printf("%d %d ", p3, p4);
printf("%d ", sizeof('h'));//3.为什么结果是4 ???
printf("%d ", sizeof("hello"));
return 0;
}
[其他解释]
[其他解释]
[quote=引用:]
1 不能
'a'意为“字符a的ASCII码”,它的类型是int,数值是97(或者96,记不清了)
这条语句的意思是,定义一个字符指针p1,它指向地址空间中绝对地址为97的内存。
2 可以
直接写在代码中的字符串,在编译时就被编译为这个字符串存放在常量区的地址。
这条语句的意思是,在常量区放置一个字符串"hello",并将它的地址赋给字符指针p3;
3 上面说过了'a'的类型,sizeof(int)==4
正解
[其他解释]
ls解释得很清楚了。
[其他解释]
问题圆满解决,感谢楼上各位的解答!
另有一问:为什么C++里sizeof('H')是4?
[其他解释]
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是很多数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
[其他解释]
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
[其他解释]
++
[其他解释]
对第三个
上面的结论是怎么得出来的……
明明打印出来的是1!
VC和GCC都是,难道楼主是来钓鱼的?
[其他解释]
字符常量是char型,sizeof应该是1才对嘛。楼主用的什么编译器,什么平台?
[其他解释]
gcc, win32, 注意文件文件后缀名是.c
------其他解决方案--------------------
又在出题考人。。