C指针和物理地址

6 c pointers

我刚刚开始C.我已阅读各种书籍/教程中的指针,我理解基础知识.但有一点我没有看到解释的是数字是多少.

例如:

int main(){
   int anumber = 10;
   int *apointer;

   apointer = &anumber;

   printf("%i", &apointer);
   }
Run Code Online (Sandbox Code Playgroud)

可能会返回一个像4231168这样的数字.这个数字代表什么?它是RAM中的一些存储名称吗?

Lun*_*din 9

很多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千兆字节.

要详细解释这个宏:

  • 0x1234是寄存器/存储器位置的地址.
  • 我们需要通过指针访问这个内存位置,因此我们将整数常量0x1234类型化为unsigned char指针=指向一个字节的指针.
  • 这假设我们感兴趣的寄存器大1字节.如果它是两个字节大,我们可能会使用unsigned short代替.
  • 硬件寄存器可以随时更新(它们的内容是"易失性的"),因此不允许程序对存储在其中的内容进行任何假设/优化.在代码中使用寄存器时,程序必须从寄存器中读取值.要强制执行此行为,我们使用volatile关键字.
  • 最后,我们想要访问寄存器就像它是一个普通变量一样.因此添加*,以获取指针的内容.

现在,程序可以访问特定的内存位置:

MY_REGISTER = 1;
unsigned char var = MY_REGISTER;
Run Code Online (Sandbox Code Playgroud)

例如,像这样的代码在嵌入式应用程序中随处可用.

(但正如在其他回复中已经提到的那样,你不能在现代PC中做这样的事情,因为他们正在使用一种叫做虚拟寻址的东西,如果你尝试的话就会给你一记耳光.)


Dav*_*nan 7

它是指针所指向的内存的地址或位置.但是,最好将此视为不透明的数量 - 您永远不会对指针的实际值感兴趣,只会指向它所指的那个.

然后,地址如何与物理内存相关联是系统提供的服务,并且实际上跨系统变化.

  • @B Mitch在这种情况下,你不关心绝对地址,只关心偏移量或相对地址 (3认同)