不明白为什么有些指针地址是这样的
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 OS。)
指针算法是根据对象而不是字节来完成的。如果 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
objects(不是字节!!)来自该地址并尊重结果。
正在学习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 OS。)
指针算法是根据对象而不是字节来完成的。如果 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
objects(不是字节!!)来自该地址并尊重结果。