指针指向哪里,例如用C语言? (我认为在所有可能寻址的语言中都是一样的)我的意思是它确切地说是哪种类型的存储器。 (RAM,寄存器等)
现在有哪些记忆可以指出?
答案 0 :(得分:3)
指针可以指向任何可寻址的内存。这意味着他们无法指向寄存器。内存类型是内存映射的任何内容,因此可以是RAM或ROM,例如,甚至是文件等。基本上,任何可以识别我的地址的内容。
正如奥利弗查尔斯沃思所说,指针指向一个“物体”。在C(++)中,对象只是表示值的数据存储区域。
答案 1 :(得分:3)
所有主存储器(RAM)都可以被认为只是一个字节数组。
指针可以被认为只是这个数组的索引。
在具有内存虚拟化的现代系统上,并非所有内存都可以被访问,因此如果您将指针指向任何随机位置并尝试从该位置读取或写入,则必然会遇到非法内存访问异常。但是,只要你保持指针指向程序的变量,你就可以了。
此外,存在可读但不可写的存储器,或者由于操作系统设置的许可,或者因为它是已映射到RAM的地址空间的ROM。因此,只是因为您可以从指针指向的内存位置读取值,这并不意味着您可以写入它。
不,指针不能指向CPU寄存器。 CPU寄存器完全在称为RAM的大字节数之外。 (但是,存在将硬件的某些特殊I / O寄存器映射到RAM位置的体系结构,因此这些寄存器实际上可以通过指针访问。因此,它取决于我们所讨论的寄存器类型。)
关于指针的许多混淆是由于当我们打印它们的值时,我们会看到像0x51a4851c
这样难以理解的值,但我们从不为它们分配文字值,例如{{1} }。
那是因为我们的程序(以及我们程序使用的数据)位于看似随机的内存位置,如char* p = 0x51a4851c;
,几十年来,除了最小的嵌入式系统之外,所有程序的趋势都是不必知道(永远不必担心)你的程序加载到哪个地址,因为它的信息太多,没有实际用途。
因此,当您说0x51a48000
时,编译器将生成将char* p = &c;
地址加载到c
的代码,而无需确切知道p
的位置。
事实上,操作系统可以自由地将程序加载到它认为合适的任何地址,因此这个地址可能会在程序运行之间发生变化,所以你不必知道任何固定的地址是一件非常好的事情。 ,因为真的没有。 (除了最小的嵌入式系统外。)
答案 2 :(得分:2)
这取决于计算机体系结构,特别是取决于CPU的可寻址内容。
在具有RAM,ROM和内存映射硬件寄存器的体系结构中,指针可以指向RAM中的位置,ROM中的位置或硬件寄存器。
这在具有虚拟内存管理功能的计算机上变得更加复杂,因为指针指向的位置取决于程序执行的上下文。
就C编程而言,指向用malloc
分配的对象的指针和指向自动存储器(堆栈)中对象的指针将指向RAM中的位置。指向静态分配的常量对象和字符串文字的函数和指针的指针可以指向ROM中的位置。