一行代码,求解释

xuejianbest 2011-01-27 01:43:20
#include <stdio.h>

int main(void)
{
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;
}
运行输出如下

求解释,关键是输出的第三行。谢谢。编译工具(Microsoft Visual C++ 6.0)
...全文
575 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wht75671509 2011-01-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 niuchengshi 的回复:]

char c='0123'; 这个声明C是字符型变量,字符型变量只能存储1个字符,而该表达式里给c赋予了4个字符,至于会给c赋予哪个值是由编译器决定的。不同的编译器可能赋给不同的值。有的是只赋予第一个值,就是‘0’有的赋予最后一关值就是‘3’;在你的编译器里是赋予最后一关值‘3’,所以最后一行打印的是3以及存储‘3’这个变量后面3个位置的值。由于后面的内存位置没有定义,所以显示的是‘?’。
[/Quote]


++++
w346581442 2011-01-29
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(void)
{
char a='A',b='B';
static 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;
}

漫步者、 2011-01-29
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
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)); //关键解释这一句

//C就是等于3啊,*(&c+3),*(&c+2),*(&c+1),这段你可以看作是数组一样//
//其实C只有一个地址存在着有效值,你再向后移动n*sizeof(char)是没有用的,这个根本就不存在,所以是任意的东西、
return 0;
}

hrx1989 2011-01-27
  • 打赏
  • 举报
回复
给一个字符型赋予这么多的字符???
iew_123456 2011-01-27
  • 打赏
  • 举报
回复
再说了 你这么定义能通过么?!
char c='0123'
lei001 2011-01-27
  • 打赏
  • 举报
回复
说的有理,

[Quote=引用 15 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
[/Quote]
iew_123456 2011-01-27
  • 打赏
  • 举报
回复
char c='0123';

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

&c+3是下一个数组的首位即c[6],&c+1即C[4];
  • 打赏
  • 举报
回复
后面的内存位置没有定义,所以显示的是‘?’
楼主调试下,可以看的清楚
xzjxylophone 2011-01-27
  • 打赏
  • 举报
回复
地址运算,
chunhong89 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ugly927846 的回复:]
引用 4 楼 niuchengshi 的回复:
char c='0123'; 这个声明C是字符型变量,字符型变量只能存储1个字符,而该表达式里给c赋予了4个字符,至于会给c赋予哪个值是由编译器决定的。不同的编译器可能赋给不同的值。有的是只赋予第一个值,就是‘0’有的赋予最后一关值就是‘3’;在你的编译器里是赋予最后一关值‘3’,所以最后一行打印的是3以及存储‘3’这个变量后面3个位置的值。由于后……
[/Quote]++
masmaster 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 niuchengshi 的回复:]
char c='0123'; 这个声明C是字符型变量,字符型变量只能存储1个字符,而该表达式里给c赋予了4个字符,至于会给c赋予哪个值是由编译器决定的。不同的编译器可能赋给不同的值。有的是只赋予第一个值,就是‘0’有的赋予最后一关值就是‘3’;在你的编译器里是赋予最后一关值‘3’,所以最后一行打印的是3以及存储‘3’这个变量后面3个位置的值。由于后面的内存位置没有定义,所以显示的是‘?’。
[/Quote]
正解!!
goldfrog 2011-01-27
  • 打赏
  • 举报
回复
楼上的兄弟诲人不倦啊...

int a = '.AVI';
这样的东西是一种老的C代码里比较常见的tag,因为结果跟编译器相关,最好是别用了
赵4老师 2011-01-27
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
wizard_tiger 2011-01-27
  • 打赏
  • 举报
回复
第三行打印的c的值和c后面连续3个字节里面的值。
只是后面连续3个字节中的值是不确定值(也有可能是不可显示的字符)。
lx3275852 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fresh_han 的回复:]
我在我的dev上试了一下,×&c输出的是3。但是×(&c - 1)输出的仍是乱码。这时为什么呢?

引用 4 楼 niuchengshi 的回复:
char c='0123'; 这个声明C是字符型变量,字符型变量只能存储1个字符,而该表达式里给c赋予了4个字符,至于会给c赋予哪个值是由编译器决定的。不同的编译器可能赋给不同的值。有的是只赋予第一个值,就是‘0’有的赋予最后一关……
[/Quote]
想输出0123,就不能给c定义char类型

#include <stdio.h>
int main()
{
int a = '0123';
char *p = (char*)&a;
printf( "%c,%c,%c,%c\n", *p, p[1], *(p+2), p[3] );
return 0;
}

因为 本来'0123'是一个整数,复制给一个char c 会自动截断为1个字节啊。。
AnYidan 2011-01-27
  • 打赏
  • 举报
回复

引用 4 楼 niuchengshi 的回复:
char c='0123'; 这个声明C是字符型变量,字符型变量只能存储1个字符,而该表达式里给c赋予了4个字符,至于会给c赋予哪个值是由编译器决定的。不同的编译器可能赋给不同的值。有的是只赋予第一个值,就是‘0’有的赋予最后一关……
[/Quote]

ansi 规定只有 array 的存储空间是连续的
fresh_han 2011-01-27
  • 打赏
  • 举报
回复
这个还说的通。[Quote=引用 9 楼 shjnba 的回复:]
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)); //关键解释这一句
楼主第一行没有错,是11
第二行也没有错,取地址都对,但逻辑上有错。
第三行也没有错。在相应的地址上打印出……
[/Quote]
欣客 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 niuchengshi 的回复:]
char c='0123'; 这个声明C是字符型变量,字符型变量只能存储1个字符,而该表达式里给c赋予了4个字符,至于会给c赋予哪个值是由编译器决定的。不同的编译器可能赋给不同的值。有的是只赋予第一个值,就是‘0’有的赋予最后一关值就是‘3’;在你的编译器里是赋予最后一关值‘3’,所以最后一行打印的是3以及存储‘3’这个变量后面3个位置的值。由于后面的内存位置没有定义,所以显示的是‘?’。
[/Quote]


解释的太好了。
shjnba 2011-01-27
  • 打赏
  • 举报
回复
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)); //关键解释这一句
楼主第一行没有错,是11
第二行也没有错,取地址都对,但逻辑上有错。
第三行也没有错。在相应的地址上打印出相应的值。逻辑又错了。
因为字符型类型只占一个字节。而你的C有4个字节,那系统只能分配一个字节,按照C语言的顺序从右到左,系统分配空间给了3,其它的都舍掉。至于",*(&c+3),*(&c+2),*(&c+1)这些值是什么只有系统知道,这是没有办法控制的。
NowDoIT 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 niuchengshi 的回复:]
char c='0123'; 这个声明C是字符型变量,字符型变量只能存储1个字符,而该表达式里给c赋予了4个字符,至于会给c赋予哪个值是由编译器决定的。不同的编译器可能赋给不同的值。有的是只赋予第一个值,就是‘0’有的赋予最后一关值就是‘3’;在你的编译器里是赋予最后一关值‘3’,所以最后一行打印的是3以及存储‘3’这个变量后面3个位置的值。由于后面的内存位置没有定义,所以显示的是‘?’。
[/Quote]

正解
加载更多回复(13)

69,369

社区成员

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

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