[英]C pointers and the physical address
我刚刚开始C.我已阅读各种书籍/教程中的指针,我理解基础知识。 但有一点我没有看到解释的是数字是多少。
例如:
int main(){
int anumber = 10;
int *apointer;
apointer = &anumber;
printf("%i", &apointer);
}
可能会返回一个像4231168这样的数字。这个数字代表什么? 它是RAM中的一些存储名称吗?
很多PC程序员一如既往地回复。 以下是通用编程观点的回复。
在进行任何形式的硬件相关编程时,您会对地址的实际数值感兴趣。 例如,您可以通过以下方式访问计算机中的硬件寄存器:
#define MY_REGISTER (*(volatile unsigned char*)0x1234)
此代码假定您知道位于地址0x1234的特定硬件寄存器。 计算机中的所有地址都是按照传统/为方便起见以十六进制格式表示的。
在这个例子中,地址是16位长,这意味着所用计算机上的地址总线是16位宽。 计算机中的每个存储单元都有一个地址。 因此,在16位地址总线上,最多可以有2 ^ 16 = 65536个可寻址存储单元。 例如,在PC上,地址通常为32位长,为您提供429亿个可寻址存储单元,即4.29千兆字节。
要详细解释这个宏:
现在,程序可以访问特定的内存位置:
MY_REGISTER = 1;
unsigned char var = MY_REGISTER;
例如,像这样的代码在嵌入式应用程序中随处可用。
(但正如在其他回复中已经提到的那样,你不能在现代PC中做这样的事情,因为他们正在使用一种叫做虚拟寻址的东西,如果你尝试的话就会给你一记耳光。)
它是指针所指向的内存的地址或位置。 但是,最好将此视为不透明的数量 - 您永远不会对指针的实际值感兴趣,只会指向它所指的那个。
然后,地址如何与物理内存相关联是系统提供的服务,并且实际上跨系统变化。
这是anumber
变量的虚拟地址。 每个程序都有自己的内存空间,并且内存空间映射到物理内存。 由处理器完成的映射id和用于该处理的服务数据由操作系统维护。 因此,您的程序永远不会知道它在物理内存中的位置。
它是存储变量的内存1位置的地址。 您不应该关心确切的值,您应该知道不同的变量具有不同的地址,“连续的内存”(例如数组)具有连续的地址,...
顺便说一下,要打印存储在指针中的地址,您应该使用printf
的%p
说明符。
很多人告诉你,指针的数值会指定它的地址。 这是实现可以实现的一种方式,但是非常重要,C标准对指针的评价是:
int array[128]; int a, b; a = (int)&array[120]; b = (int)&array[100]; a - b == 20 ; array + (ab) == &array[20]; &array[120] == (int*)a
int array[128]; int a, b; a = (int)&array[120]; b = (int)&array[100]; a - b == 20 ; array + (ab) == &array[20]; &array[120] == (int*)a
它不是打印的变量数字的地址,而是打印的指针的地址。仔细查看。它只是“apointer”,然后我们就会看到数字变量的地址。
是的,确切地说 - 它是内存中apointer数据的地址。 诸如anumber和apointer之类的局部变量将在程序的堆栈中分配,因此它将引用堆栈中main()函数框架中的地址。
如果你已经使用malloc()分配了内存,那么它将引用程序堆空间中的位置。 如果它是固定字符串,则可以指代程序数据中的位置或rodata(只读数据)段。
在这种情况下,apointer表示指针变量apointer的RAM存储器中的地址
apointer
是可变的“地址” anumber
。 从理论上讲,它可能是在RAM中的实际物理地方的价值anumber
存储,但在现实中(在大多数OS'es)很可能是在虚拟内存中的位置。 结果虽然如此。
它是一个内存地址,最有可能是程序堆栈中的当前位置。 与大卫的评论相反,有时你会计算指针偏移量,但这只是你正在处理的某种数组。
它是指针的地址。
“anumber”在RAM中占用一些空间,此位置的数据包含数字10。
“apointer”也会在RAM中占用一些空间,此位置的数据包含RAM中“anumber”的位置。
所以,假设你有32个字节的ram,地址为0..31
在例如位置16,你有4个字节,“anumber”值10
在例如位置20,你有4个字节,“apointer”值16,“anumber”在RAM中的位置。
你打印的是20,apointer在RAM中的位置。
请注意,这不是直接在RAM中,而是在映射到RAM的虚拟地址空间中。 为了理解指针,您可以完全忽略虚拟地址空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.