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

问题描述 投票:1回答:1

我正在学习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;
}

在这段代码中,我们这么说

&c = 0117FE7B
&pc = 0117FE6C
&ppc = 0117FE60

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

ppc + 1 = 0117FE6D
&pc + 1 = 0117FE6D
&ppc + 1 = 0117FE61

但是正确的答案是这样的:

ppc + 1 = 0117FE70
&pc + 1 = 0117FE70
&ppc + 1 = 0117FE64

而且我不明白为什么。有人可以帮我解释一下吗?(我的计算机使用的是64位Windows操作系统。)

c pointers 64-bit memory-address
1个回答
0
投票

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

int x;
int p = &x;

    +---+
x : |   | <-- p
    +---+
    |   |
    +---+
    |   | 
    +---+
    |   |
    +---+
    |   | <-- p + 1
    +---+
    |   |
    +---+
    |   |
    +---+
    |   |
    +---+

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

© www.soinside.com 2019 - 2024. All rights reserved.