C指针:当你取消引用一个char指针并尝试存储一个int时,它会存储整个int吗?

时间:2011-10-18 04:13:56

标签: c pointers

假设你有:

    void *p = // something;
    int size = 10;
    *((char *)p + 8) = size ^ 1;

我知道这看起来像是随机的逻辑,但我想知道它是否仍然会按预期进行。当p被转换为char时,我试图将“size ^ 1”的整体放在“p + 8”指向的地址处。基本上我要问的是,它与以下内容有什么不同:

    *((int *)p + 2) = size ^ 1;

此外,如果我选择将指针增加3,会发生什么,例如:

    *((char *)p + 3) = size ^ 1;

或(我知道这不等同于所有其他人,但想知道这是否正确):

    *((int *)p + 3) = size ^ 1;

3 个答案:

答案 0 :(得分:5)

当您解除char *指针时,您指的是单个char对象。这样,它非常类似于:

char c;

c = size ^ 1;

即,结果值(在本例中为11)转换为类型char,然后存储在(char *)p + 8位置(char对象指向的p对象1}})。

所以是的,它与以下内容完全不同:

*((int *)p + 2) = size ^ 1;

后一行修改整个int对象,大小为sizeof(int),修改的对象是int指向的第三个p对象。

如果我们想象您有一个带有sizeof(int) == 4的小端系统,那么您的四个示例将通过以下方式修改p指向的内存:

1

*((char *)p + 8) = size ^ 1;

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? |

2

*((int *)p + 2) = size ^ 1;

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 | ?? | ?? | ?? | ?? |

3

*((char *)p + 3) = size ^ 1;

| ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |

4

*((int *)p + 3) = size ^ 1;

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 |

答案 1 :(得分:1)

*((char *)p + 8) = size ^ 1隐式地将size ^ 1强制转换为char,除了最低位字节之外,它们除外;所以不,它与*((int *)p + 2) = size ^ 1不一样。

答案 2 :(得分:0)

*((char *)p + 8) = size ^ 1;与:

无异
char something;
something = size ^ 1;

你可以从那里弄清楚,但更好的只是尝试并找出答案!