我想知道是否
int v [10];
分配(除10 * sizeof(int)个字节之外)也是指向此向量的整数的指针。
有两个概念层次可以理解这个问题。
首先,C是根据抽象机定义的。在此模型中,v
标识一个10的数组int
。v
不是指针;“ v”是标识符,它标识的事物名为v
10的数组int
。没有指针。当v
在源代码中用于表达式而不用于获取其大小(带有sizeof
)或地址(带有&
)时,它将自动转换为指针。实际上,该指针是根据需要制造的-尚未(在C标准描述的模型中)存储在任何地方或从任何地方加载。它只是在需要时制作的。
其次,当C实现使用数组时,它们具有各种引用内存的方式。如果数组是静态对象(因为它是在任何函数外部定义的),则通常将其放在为静态数据保留的内存段中的某个位置。C实现引用此内存的方式有多种,包括:
如果对象是自动的而不是静态的(如在函数内部定义,没有static
关键字),则典型的C实现使用堆栈上的内存。此方法类似于上述的基址寄存器和偏移量方法,但是基址寄存器是称为堆栈指针的特殊寄存器,在调用每个函数时会对其进行调整,以指向仅为该特定用途保留的内存函数调用。
每当使用基址寄存器和偏移量方法时,绝对地址就永远不会以程序观察到的方式存在。例如,一条指令可能包含诸如38(sp)
(如汇编语言中所述)的位置引用,这意味着“堆栈指针指向的位置超出38个字节”。处理器将获取堆栈指针的内容,向其添加38,然后从内存中获取(如果读取)该位置的内容。在这种情况下,绝对地址会暂时存在于处理器内部的某个位置,在该位置进行38加。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句