[英]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.