#include<stdio.h>
int main()
{
int a = 258;
char *b = &a;
b++;
*b =2;
printf("%d",a);
return 0;
}
a的值是514,但我不知道如何?!你能解释下面的C代码的输出吗?
#include<stdio.h>
int main()
{
int a = 258;
char *b = &a;
b++;
*b =2;
printf("%d",a);
return 0;
}
a的值是514,但我不知道如何?!你能解释下面的C代码的输出吗?
给定一个32位的2的补码系统中,可变a
可以存储在通过以下方式(十六进制):
02 01 00 00 // little endian, or
00 00 01 02 // big endian
你点在此整数的第一个字节,然后增加1指针。在一个小端系统中,您现在将指向值01
,在一个大端系统上,您现在将指向值00
。
看起来你有一个小端系统,因为你将值01
更改为02
并导致内存看起来像02 02 00 00
。这个翻译为十进制数会给你514
假设你是一个小端系统上工作:
int a = 258
它代表一个十六进制4字节数,0x00000102
char *b = &a;
做一个指向一个字节大小的数据类型,所以它只指向最后一个0x02
b++;
将指针1个字节,现在它指向0×01
*b = 2;
更改您的int从地址0x01为0x02 现在你有a
a = 0x00000202 = 514
此答案假定整数存储在[little endian](https:/ /en.wikipedia.org/wiki/Endianness)符号(这可能**是海报计算机上的实际字节顺序,只要它们得到结果)。 – axiac
觉得作为数组第二个字节字节(char
)与sizeof(int)
元素。
随着
char *b = &a;
你让b
指向此数组中的第一个元素。
然后你做b++
这使得b
指向第二个元素。然后给第二个元素赋值,这会修改a
的值。
另请注意,结果取决于您的系统的字节顺序上的很。
258
看起来像00000000 00000000 00000001 00000010
(在小端)。
然后您将b
指向00000010
的“第一个char
”。
现在你增加b
,因为它是char
型的,现在进入下一寻址char
这是00000001
(以下简称“第二”元素),然后将其更改为2
这是00000010
。
所以现在我们有00000000 00000000 00000010 00000010
这是514
当作为int
阅读。
这个结果并不能保证,尽管在big-endian上结果会有所不同。
这个答案假定整数存储在[little endian](https://en.wikipedia.org/wiki/Endianness)表示法中(这可能是**是发布者计算机上的实际字节顺序,给出结果他们得到)。 – axiac
[C++ *“proof”*](http://melpon.org/wandbox/permlink/FQhUdebvexmt5PkO) –
@axiac是的,我已经补充说明了,谢谢。 –
int a = 258;
假设int是4个字节长在你的机器,它会被存储为
00000000 00000000 00000001 00000010
当你这样做char *b = &a;
,B将指向从右边的第一个字节是00000010
当你做b++;
时,假设你的机器中char是1个字节,b值加1,现在它指向右边第二个字节,即00000001.
现在你做*b =2;
。所以第二个字节将变成00000010
。
所以,如果你看到,a
,它会是这样的。
00000000 00000000 00000010 00000010
哪个是512
整数型“B”变量的第二个字节将被增加作为变量是字符类型的。您的答案将更改为514
258 = 1 * 256 + 2. 514 = 2 * 256 + 2.您将1更改为2 –