转帖~

lovelyzxg 2011-02-25 11:38:15
#include <stdio.h>
int main()
{
char a='A',b='B';
char c='0123';

printf("%d %d\n",sizeof(a),sizeof(c));
printf("%p %p %p %p\n",&a,&b,&c,&c+1);
printf("%c\t%c\t%c\t%c\n",*(&c+3),*(&c+2),*(&c+1),*(&c)); //关键解释这一句

return 0;
}


运行输出如下,求解释,关键是第三行输出。谢谢。
转帖~
...全文
101 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-03-01
  • 打赏
  • 举报
回复
本身就是错误,你们都知道char c='123';到底编译器怎么处理么,不知道就别试了.
赵4老师 2011-03-01
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
漫步者、 2011-03-01
  • 打赏
  • 举报
回复
接LS的:
int c='0123'; //楼主写的是char c = '0123'
//我认为应该是int型,才能放得下0123

楼主写的是char c = '0123'
是可以这样的,依次入栈,最后是3覆盖掉了前面的数据,因为char实质上是按int存储,但是由于char本身只占一个字节,所以结果为3,后面的printf输出前面大家分析的不错。
lx3275852 2011-03-01
  • 打赏
  • 举报
回复
其实我看到楼主的结贴率,本来打算不回帖的。。。
但是我是好人,给新手提一下!~
虽然没看过原帖,但是我认为代码应该是这样的才能行得通:
//注:修改了代码并且加了注释

#include <stdio.h>
int main()
{
char a='A',b='B';
int c='0123'; //楼主写的是char c = '0123'
//我认为应该是int型,才能放得下0123

printf("%d %d\n",sizeof(a),sizeof(c));
printf("%p %p %p %p\n",&a,&b,&c,&c+1);
printf("%c\t%c\t%c\t%c\n",*((char*)&c+3),*((char*)&c+2),*((char*)&c+1),*((char*)&c)); //关键解释这一句
//强制类型转换一下,挨个把int型c的4个字节分别输出出来,你会惊讶的发现结果居然是 0 1 2 3

return 0;
}


总结:主要讲解的是单引号''的作用,为了引入宽字节,''做了一些扩展功能,所以支持我们这样做!~
yjjlyyj151 2011-02-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 lovelyzxg 的回复:]
#include <stdio.h>
int main()
{
char a='A',b='B';
char c='0123';

printf("%d %d\n",sizeof(a),sizeof(c));
printf("%p %p %p %p\n",&a,&b,&c,&c+1);
printf("%c\t%c\t%c\t%c……
[/Quote]

LZ把c定义成char c='0123'这样是一个字符,如果是字符串应该是char c[]="0123"
無_1024 2011-02-26
  • 打赏
  • 举报
回复
&c,取c的地址
&c+1 c的地址+1
",*(&c+3),*(&c+2),*(&c+1),*(&c));
输出是???3
注意c是一个字符但是你的是0123 根据栈的原理 c的值将会被赋值为3 而char占用一个地址 前三个地址没有数据 所以是不确定的
AnshuWang 2011-02-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 lovelyzxg 的回复:]
#include <stdio.h>
int main()
{
char a='A',b='B';
char c='0123';

printf("%d %d\n",sizeof(a),sizeof(c));
printf("%p %p %p %p\n",&a,&b,&c,&c+1);
printf("%c\t%c\t%c\t%c……
[/Quote]
&c是取变量c的地址
*(&c) 取地址里的值
昵称很不好取 2011-02-25
  • 打赏
  • 举报
回复
栈是从高地址向低地址生长,c在a和b下面,于是&c+1就是b的地址,这句其实就是打印字符c前面3个字符

69,371

社区成员

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

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