我不明白为什么有些指针地址是这样的

Jun*_*oon 1 c 64-bit pointers memory-address

我正在学习 C 语言的指针,我有一些问题。

#include <stdio.h>

int main()
{
    char c = 'A';
    char* pc = &c;
    char** ppc = &pc;

    printf("%p %p\n", pc, ppc);
    printf("%p %p\n", pc + 1, ppc + 1);
    printf("%p %p\n", &c, &c + 1);
    printf("%p %p\n", &pc, &ppc);
    printf("%p %p\n", &pc + 1, &ppc + 1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,让我们说

&c = 0117FE7B
&pc = 0117FE6C
&ppc = 0117FE60
Run Code Online (Sandbox Code Playgroud)

我以为有些答案会是这样的:

ppc + 1 = 0117FE6D
&pc + 1 = 0117FE6D
&ppc + 1 = 0117FE61
Run Code Online (Sandbox Code Playgroud)

但正确的答案是这样的:

ppc + 1 = 0117FE70
&pc + 1 = 0117FE70
&ppc + 1 = 0117FE64
Run Code Online (Sandbox Code Playgroud)

我不明白为什么。有人可以为我解释一下吗?(我的电脑使用的是 64 位 Windows 操作系统。)

Joh*_*ode 5

指针算术是根据对象而不是字节完成的。如果p计算为 4 字节int对象p + 1的地址,则计算为下一个 4 字节int的地址,而不是下一个字节:

int x;           // assume 4-byte int
int *ip = &x;

short s;         // assume 2-byte short
short *sp = &s;

char c;
char *cp = &c;

    +---+                  +---+                   +---+
x : |   | <-- ip       s : |   | <-- sp        c : |   | <-- cp
    +---+                  +---+                   +---+
    |   |                  |   |                   |   | <-- cp + 1
    +---+                  +---+                   +---+
    |   |                  |   | <-- sp + 1        |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   | <-- ip + 1       |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
Run Code Online (Sandbox Code Playgroud)

因此,根据指向类型的大小,p + 1将给出地址 + 1,或地址 + 4,或地址 + 8,等等。

请记住,数组下标操作a[i]定义*(a + i)-给定的开始地址a,偏移量i 的对象(未字节!!)从该地址和顺从的结果。