char *的大小是否与int *的大小相同?

我知道:char *是一个指向char的指针。 和int *是指向int的指针。

所以,我想确认以下两件事:

  1. 所以现在假设我在32位机器上,那么这意味着内存地址是32位宽。 这意味着char *和int *的大小都是32位(4字节),对吧? char * *的大小也与int *的大小相同?

  2. 假设我有:int * ptr;

因此现在做*((char * *)ptr)= 0x154与*((int *)ptr)= 0x514相同,对吧? (0x514只是任意随机存储器地址)

平台:我在x86上。

PS:我知道类型转换不是建议的代码方式。 但我正在做内核编码,因此我必须做类型转换!

在C指针中不保证具有相同的大小 。 现在实际上大多数实现指针的大小都相同,但这是编译器的实现细节。

来自C Faq :

旧的HP 3000系列使用不同的字节地址寻址方案而不是字地址; 比如上面的几台机器因此对char *和void *指针使用不同于其他指针的表示

根据使用的“内存模型”,8086系列处理器(PC兼容机)可能使用16位数据指针和32位函数指针,反之亦然。

此外*((char *)ptr) = 0x154*((int *)ptr) = 0x154 。 因为您要取消引用指针,所以您将把char的大小和int的大小写入ptr指向的位置。 假设一个8位字符和一个32位int, *((char *)ptr) = 0x154*((char *)ptr) = 0x154写入分配给ptr的内存地址和*((int *)ptr) = 0x1540x0000000154写入4字节开始在分配给ptr的地址。

从技术上讲,C标准只保证sizeof(char)== 1,其余的由实现决定。 但在现代x86架构(例如Intel / AMD芯片)上,它是相当可预测的。

您可能听说过处理器被描述为16位,32位,64位等。这通常意味着处理器使用N位作为整数。 由于指针存储内存地址,而内存地址是整数,因此这有效地告诉您将使用多少位作为指针。 sizeof通常以字节为单位,因此为32位处理器编译的代码将报告指针大小为4(每位32位/ 8位),64位处理器的代码将报告指针大小为8 (每字节64位/ 8位)。 这就是32位处理器4GB RAM的限制来自 – 如果每个存储器地址对应一个字节,为了满足更多存储器需要大于32位的整数。

实际上,指针在16位系统上的大小为2(如果你能找到一个),在32位系统上是4,在64位系统上是8,但是依靠给定的东西没有任何好处。尺寸