为什么必须为指针设置类型?它们不仅仅是地址和所有地址的占位符吗?因此,无论指定的类型占用相同大小的内存,都不会获得所有指针?
答案 0 :(得分:11)
您不必为指针指定类型。您可以在任何地方使用./
,这会强制您在每次从指针指向的地址读取内容时插入显式类型转换,或者向该地址写入内容,或者只是递增/递减或以其他方式操纵指针的值。
但人们很久以前就决定他们厌倦了这种编程方式,并且首选的类型指针
是的,确实,所有数据指针,无论其类型如何,都占用相同数量的内存,通常在32位系统上为4个字节,在64位系统上为8个字节。数据指针的类型与指针占用的内存量无关,这是因为没有类型信息与指针一起存储;指针类型仅对人类和编译器有用,而不对机器有用。
答案 1 :(得分:1)
不同类型会占用不同的内存量。因此,当推进指针(例如在数组中)时,我们需要考虑类型的大小。 例如,因为char只占用一个字节,所以转到下一个元素意味着将0x01添加到该地址。但是因为int占用4个字节(在许多架构上),所以到达下一个元素需要将0x04添加到存储在指针中的地址。 现在,我们可以有一个单一的指针类型,它只是描述一个没有类型信息的地址(事实上,这就是void *的用途),但是每当我们想要增加或减少它时,我们需要给出类型的大小也是如此。
这是一些真实的C代码,它们展示了您将要经历的痛苦:
#include <stdlib.h>
typedef void* pointer;
int main(void) {
pointer numbers = calloc(10, sizeof(int));
int i;
for (i = 0; i < 10; i++)
*(int*)(numbers + i * sizeof(int)) = i;
/* this could have been simply "numbers[i] = i;" */
/* ... */
return 0;
}
这里要注意三件重要的事情:
答案 2 :(得分:0)
如果你想用指针评估指向元素的值,那么你必须在声明指针上指定指向元素的类型。因为编译器不知道指针所指的确切字节数。机器必须计算特定的有界内存来评估值。