3

标题中给出了问题:我不知道为什么会这样。有人可以告诉我这些技巧是如何工作的。

这是我的代码:

#include<stdio.h>
int main(){
    int a = 320;
    char *ptr;
    printf("%p\n",&a);
    ptr =( char *)&a;
    printf("%p\n",ptr);
    printf("%d\n",a);
    printf("%d\n",*ptr);
    return 0;
}

输出:

0x7fffc068708c 
0x7fffc068708c
320
64
4

4 回答 4

6

There is only one value stored.

The second printf takes the first char's worth of data at that address, promotes it to int, and prints the result. The first prints the whole int.

(320 == 256 + 64, or 0x140 == 0x01 0x40)

于 2013-05-02T06:56:04.743 回答
5

The actual data at 0x7fffc068708c is 0x00000140.

That's 320 in decimal.

But if you access it via ptr =( char *)&a;, then you only get 0x40.

That's 64 in decimal.

于 2013-05-02T06:55:50.677 回答
3

真的很简单:使用char指针,您可以删除一个字节以上的任何额外数据位:

  a = 320

 0x  00  00  00  00  01  40
    |      a               |   -> 0x 00000140 = 320
                       |ptr|   -> 0x 40       = 64

您“看到”了两个值,因为您没有使用所有可用的精度。

如果您使用的是 short 而不是 char,您将“看到”一个值,但实际上,这只是解释数据的方式。

于 2013-05-02T07:03:42.277 回答
0

关键是在将 a 分配给 ptr 时,您说它是指向字符而不是整数的指针。改变它并尝试

于 2013-05-02T06:57:03.370 回答