指针如何存储在内存中?

Tes*_*sla 4 memory operating-system pointers

我正在研究一个OS项目,我只是想知道指针是如何存储在内存中的?我知道指针是4个字节,那么指针如何在4个字节之间扩展呢?

我的问题是,我试图存储一个指向4字节内存插槽的指针.可以说指针是0x7FFFFFFF.什么存储在4个字节的每一个?

Dar*_*tle 5

你应该阅读Endianness.通常,你不会一次只使用指针的一个字节,因此字节的顺序是不相关的.

更新: 这是一个使用已知值制作假指针然后打印出每个字节的示例:

#include <stdio.h>

int main(int arc, char* argv[]) {
  int *p = (int *) 0x12345678;
  unsigned char *cp = (unsigned char *) &p;

  int i;
  for (i = 0; i < sizeof(p); i++)
    printf("%d: %.2x\n", i, cp[i]);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)


yuk*_*lai 5

存储指针的方式与任何其他多字节值相同.根据系统的字节顺序存储4个字节.假设4个字节的地址如下:

大端(最重要的字节优先):

Address       Byte
0x1000        0x7F
0x1001        0xFF
0x1002        0xFF
0x1003        0xFF
Run Code Online (Sandbox Code Playgroud)

小端(最低有效字节优先):

Address       Byte
0x1000        0xFF
0x1001        0xFF
0x1002        0xFF
0x1003        0x7F
Run Code Online (Sandbox Code Playgroud)

顺便说一句,4字节地址是32位系统.64位系统有8个字节的地址.

编辑:要引用指针的每个部分,您需要使用指针.:)说你有:

int i = 0;
int *pi = &i; // say pi == 0x7fffffff
int **ppi = &pi; // from the above example, int ppi == 0x1000
Run Code Online (Sandbox Code Playgroud)

简单的指针算术可以获得指向每个字节的指针.