你能解释一下下面C代码的输出吗?

时间:2016-12-08 10:05:30

标签: c pointers

#include<stdio.h>
int main()
{
    int a = 258;
    char *b = &a;
    b++;
    *b =2;
    printf("%d",a);
return 0;
}

a的价值是514,但我不确定如何?!

6 个答案:

答案 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