c中变量的内存地址

时间:2015-01-04 11:46:19

标签: c

// intialize a char variable, print its address and the next address
char charvar = '\0';
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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

内存是以字节而不是位来寻址的,事实上你必须接受它。获得存储器中某个字节的值后,您可以使用逻辑(按位)函数或运算符处理其位,例如&,|,^,〜等。请参阅http://www.cprogramming.com/tutorial/bitwise_operators.html

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