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

Dar*_*lar 3 c pointers

假设你有:

    void *p = // something;
    int size = 10;
    *((char *)p + 8) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)

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

    *((int *)p + 2) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)

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

    *((char *)p + 3) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)

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

    *((int *)p + 3) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 5

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

char c;

c = size ^ 1;
Run Code Online (Sandbox Code Playgroud)

也就是说,结果值(在这种情况下为11)被转换为类型char,然后存储在该位置(char *)p + 8(char指向的第9个对象p).

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

*((int *)p + 2) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)

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

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

1.

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

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
Run Code Online (Sandbox Code Playgroud)

2.

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

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 | ?? | ?? | ?? | ?? |
Run Code Online (Sandbox Code Playgroud)

3.

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

| ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
Run Code Online (Sandbox Code Playgroud)

4.

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

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 |
Run Code Online (Sandbox Code Playgroud)