c中变量的内存地址

Memory address of variables in c

// intialize a char variable, print its address and the next address
char charvar = '[=10=]';
printf("address of charvar = %p\n", (void *)(&charvar));
printf("address of charvar - 1 = %p\n", (void *)(&charvar - 1));
printf("address of charvar + 1 = %p\n", (void *)(&charvar + 1));

// intialize an int variable, print its address and the next address
int intvar = 1;
printf("address of intvar = %p\n", (void *)(&intvar));
printf("address of intvar - 1 = %p\n", (void *)(&intvar - 1));
printf("address of intvar + 1 = %p\n", (void *)(&intvar + 1));

这是我在网上找到的代码,这是相关的输出

address of charvar = 0x7fff9575c05f
address of charvar - 1 = 0x7fff9575c05e
address of charvar + 1 = 0x7fff9575c060
address of intvar = 0x7fff9575c058
address of intvar - 1 = 0x7fff9575c054
address of intvar + 1 = 0x7fff9575c05c

我的疑惑是为什么计算机中的内存地址是以十六进制格式存储的?我们知道一个char的大小是8位或1个字节,1个字节在内存中是什么意思,即charvar的起始位地址是0x7fff9575c05f char+1的地址不应该是0x7fff9575c05f + 8位是0x7fff9575c067,但似乎计算机中的一个内存位置是按 8 位或 1 字节组织的。我是对的吗?如果是,为什么?

您可以轻松访问的最小内存部分是一个字节,因此为每一位都创建一个地址是没有用的。

内存是以字节而不是位为单位寻址的,您必须接受这一事实。一旦获得内存中某个字节的值,就可以使用逻辑(按位)函数或运算符处理它的位,例如 &、|、^、~ 等。参见 http://www.cprogramming.com/tutorial/bitwise_operators.html

另外,地址不是以十六进制格式存储的,十六进制格式只是打印到输出的数字格式。如果您在 printf 调用中使用了其他格式化程序 %d 而不是 %p ,您将获得十进制格式。参见 http://www.cplusplus.com/reference/cstdio/printf/

内存是按字节组织的,指针指向特定的字节,而不是单个位。原因可能是早期的计算机有 8 位寄存器/...并且通常是一次处理整个字节。由于计算机在整个字节上运行,因此寻址字节而不是单个位更有意义。它还可以节省地址 space,允许使用相同的指针大小寻址更多内存。

此外,内存地址并不是真正以十六进制格式存储,它们只是在打印时以十六进制格式存储。在内存中,它们是二进制数,就像计算机使用的所有其他数字一样。