【发布时间】:2020-06-26 07:08:47
【问题描述】:
我正在学习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 操作系统。)
【问题讨论】:
-
ppc的类型是什么?&ppc的?请记住,指针添加会考虑基础类型的大小 -
@pmg: 在给定平台上指针的大小不一样吗?
-
在指针运算中,表达式
ptr + n有点意思是(unsigned char *)ptr + n*sizeof *ptr -
@JuneYoon:不,在 C 标准的某些规则内,不同类型的指针的大小可能会有所不同。在普通的现代 C 实现中,所有指针的大小都相同是很常见的,但这不是标准要求的。
-
@thurizas: C 2018 6.2.5 28 需要指向 void 和字符类型的指针具有相同的表示形式,需要指向结构类型的指针具有相同的表示形式,需要指向联合类型的指针具有相同的表示,并表示指向其他类型的指针不需要具有相同的表示。
标签: c pointers 64-bit memory-address