簡體   English   中英

我不明白為什么有些指針地址是這樣的

[英]I don't understand why some pointer addresses are like this

我正在學習 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 操作系統。)

指針算術是根據對象而不是字節完成的。 如果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       |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+
    |   |                  |   |                   |   |
    +---+                  +---+                   +---+

因此,根據指向類型的大小, p + 1將給出地址 + 1,或地址 + 4,或地址 + 8,等等。

請記住,數組下標操作a[i]定義*(a + i) - 給定起始地址a ,從該地址偏移i對象(不是字節!!)並尊重結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM