我发现很难理解C
中指针变量大小所依赖的因素。我检查了一些参考文献,我到目前为止唯一获得的信息是pointer
大小取决于处理器架构。我想了解以下详细信息
x bits
,则0 to 2^(X)-1
地址位置应该在那里。我在关联地址位置数和程序可用的实际内存量。 答案 0 :(得分:9)
指针是一个保存另一个内存位置地址的变量。
现在,如果您运行的是32位架构,那么保存内存引用的CPU寄存器(很可能也是所有其他寄存器)的长度都是32位;这基本上是32位的意思(寄存器是32位字长)因此指针(它是一个存储单元)通常是32位长(4字节)
同样适用于64位CPU,因此为64位CPU编译的C程序中的指针通常具有8个字节长度(64位)
修改强>
还请注意,在大多数现代架构中,您并没有真正使用代码处理物理内存;你运行并解决所谓的虚拟内存。
基本概念是CPU / OS组合使您的程序无法为您提供完整的地址空间。
同样,地址空间(你可以在内存中寻址的空间)长度将取决于CPU可以在多大程度上解决位置,并且(在一般情况下)取决于它的字大小。
答案 1 :(得分:3)
指针大小取决于很多因素(硬件,操作系统,编译器等),并且并非同一平台上的所有指针类型都可能具有相同的大小。例如,存在使用哈佛架构的嵌入式处理器,其中代码和数据在单独的存储区域中,并且每个可以具有不同的总线大小(例如,8位用于数据,16位用于代码)。这意味着对象指针(int *
,char *
,double *
)可能是8位宽,但函数指针(int (*)()
)可能是16位宽。
再举一个例子,考虑字寻址架构,其中内存的基本单位不是8位字节,而是更大的单位(宽度可以是16,18,24) ,32,36,64或128位,或其他一些值; 2的幂已被证明是方便的,但不是必需的)。其中一些架构可能会选择将多个char
值打包到一个单词中,这意味着char *
需要一些额外的位来指定单词的偏移量。
在 C: A Reference Manual 一书中,Harbison& Steele描述了一个36位字的架构。字符数据存储为7位ASCII值,这意味着每个字可以容纳5个字符,其中一位未使用;所有其他类型都用完了。
答案 2 :(得分:0)
我发现很难理解C中指针变量大小所依赖的因素。我检查了几个引用,我到目前为止唯一的信息是指针大小取决于处理器架构。它在32位机器上是4个字节,在64位机器上是8个字节。我想知道以下细节
不一定是这种情况,无论如何你必须理解一个指针的大小包含一个虚拟地址的地址(在支持它的操作系统上)。因此指针的大小取决于内存总线宽度。这就是架构影响指针大小的原因。 请注意,它并非始终如此:例如,所有指针的大小可能不同。