这可能是一个菜鸟问题..但这确实让我感到困惑。
以下是一些示例代码
void main() {
int a = 300;
char *ptr = &a;
int *intptr = &a;
printf("%d\n %d\n", *ptr, *intptr);
}
输出:
44
300
根据我的理解,为什么取消引用
*ptr
打印44是由于char指针是一个字节,所以它只能从int地址中读取8位...但这question:What is the size of a pointer?表示
Regardless of what data type they are pointing to, they have fixed size
我是否缺少某些东西。如果指针大小相同,为什么要取消引用char指针打印44?
最佳答案
在大多数可能会遇到的大多数系统上,对象指针(例如,指向函数以外的任何东西的指针)的大小通常相同,但是并不能保证如此。话虽这么说,尽管指针的大小可能相同,但它们指向的类型却不同。
例如,在64位Windows系统上,指针的大小通常为8个字节。在您的示例中,您有char *
和int *
,它们很可能都是8个字节。此处的区别在于,取消引用char *
将读取/写入1个字节,而取消引用int *
将读取/写入4个字节(假定int
为32位)。
假设字节序的字节序很少,a
在内存中看起来像这样:
------------------
a | 44 | 1 | 0 | 0 |
------------------
ptr
和intptr
都包含a
的地址。取消引用类型为ptr
的char *
时,它仅查看第一个字节。相反,当取消引用类型为intptr
的int *
时,它将查找全部4个字节。