我刚刚开始C.我已阅读各种书籍/教程中的指针,我理解基础知识.但有一点我没有看到解释的是数字是多少.
例如:
int main(){
int anumber = 10;
int *apointer;
apointer = &anumber;
printf("%i", &apointer);
}
Run Code Online (Sandbox Code Playgroud)
可能会返回一个像4231168这样的数字.这个数字代表什么?它是RAM中的一些存储名称吗?
很多PC程序员一如既往地回复.以下是通用编程观点的回复.
在进行任何形式的硬件相关编程时,您会对地址的实际数值感兴趣.例如,您可以通过以下方式访问计算机中的硬件寄存器:
#define MY_REGISTER (*(volatile unsigned char*)0x1234)
Run Code Online (Sandbox Code Playgroud)
此代码假定您知道位于地址0x1234的特定硬件寄存器.计算机中的所有地址都是按照传统/为方便起见以十六进制格式表示的.
在此示例中,地址长度为16位,这意味着所使用的计算机上的地址总线为16位宽.计算机中的每个存储单元都有一个地址.因此,在16位地址总线上,最多可以有2 ^ 16 = 65536个可寻址存储单元.例如,在PC上,地址通常为32位长,为您提供429亿个可寻址存储单元,即4.29千兆字节.
要详细解释这个宏:
现在,程序可以访问特定的内存位置:
MY_REGISTER = 1;
unsigned char var = MY_REGISTER;
Run Code Online (Sandbox Code Playgroud)
例如,像这样的代码在嵌入式应用程序中随处可用.
(但正如在其他回复中已经提到的那样,你不能在现代PC中做这样的事情,因为他们正在使用一种叫做虚拟寻址的东西,如果你尝试的话就会给你一记耳光.)
它是指针所指向的内存的地址或位置.但是,最好将此视为不透明的数量 - 您永远不会对指针的实际值感兴趣,只会指向它所指的那个.
然后,地址如何与物理内存相关联是系统提供的服务,并且实际上跨系统变化.