#include<stdio.h>
int main()
{
int a = 258;
char *b = &a;
b++;
*b =2;
printf("%d",a);
return 0;
}
a的价值是514,但我不确定如何?!
答案 0 :(得分:5)
258
看起来像00000000 00000000 00000001 00000010
(在小端)。
然后,您b
指向&#34;首先char
&#34;这是00000010
。
现在你增加b
,因为它类型为char
,现在它移动到下一个可寻址的char
00000001
(&#34;第二个& #34;元素)然后将其更改为2
00000010
。
所以现在我们00000000 00000000 00000010 00000010
514
,当int
读取时为http://localhost:53363/package/PackageDetail/mypackage/5
。
虽然在big-endian上结果会有所不同,但不保证这个结果。
答案 1 :(得分:2)
给定32位2的补码系统,变量a
可以通过以下方式存储(十六进制):
02 01 00 00 // little endian, or
00 00 01 02 // big endian
指向此整数的第一个字节,然后将指针增加1.在一个小端系统上,您现在指向值01
,并在大端系统上指向&#39; ll现在指向值00
。
您似乎有一个小端系统,因为您将值01
更改为02
并使内存看起来像02 02 00 00
。将其翻译为十进制数将为您提供514。
答案 2 :(得分:2)
将a
视为带有char
元素的字节数组(sizeof(int)
)。
使用
char *b = &a;
你使b
指向此数组中的第一个元素。
然后你做b++
使b
指向第二个元素。然后,您可以为此第二个元素指定一个值,该值将修改a
的值。
另请注意,结果在系统的字节顺序上非常非常。
答案 3 :(得分:0)
假设您正在开发一个小端系统:
int a = 258
一个4字节的数字,以十六进制0x00000102
表示char *b = &a;
指向一个字节大小的数据类型,因此它只指向最后一个0x02
b++;
将指针向上移动1个字节,现在指向0x01
*b = 2;
将int的第二个字节从0x01更改为0x02 现在你有了
a = 0x00000202 = 514
答案 4 :(得分:0)
int a = 258;
假设int在您的机器中长4个字节,它将存储为
00000000 00000000 00000001 00000010
执行char *b = &a;
时,b将指向右边的第一个字节00000010.
当你b++;
假设char在你的机器中是1个字节时,b值加1,现在它指向右边的第2个字节,即00000001。
现在你做*b =2;
。因此第二个字节将变为00000010
。
因此,如果您看到a
,就会出现这种情况。
00000000 00000000 00000010 00000010
这是512。
答案 5 :(得分:-1)
整数类型&#39; b&#39;变量的第二个字节将递增,因为变量是char类型。你的答案将改为514