C内存堆栈和堆

时间:2017-10-25 21:15:28

标签: c

#include <stdio.h>
#include <stdlib.h>

int main (void) {
  int a = 5, *ptr;
  ptr = &a;

  printf("0x%X\n", ptr);
  printf("%p\n", &ptr); //Why are these the same? 
  printf("%d\n", *ptr);

  ptr++;

  printf("0x%X\n", ptr);
  printf("%p\n", &ptr); //Why are these the same? 
  printf("%d\n", *ptr);

  return 0; 
}

为什么这两个值相同?既然我增加了指针也不应该改变地址?

2 个答案:

答案 0 :(得分:4)

您增加了ptr的值。它仍然存在于内存中的相同位置。 &ptr告诉你它的地址。这与做a++之类的事情没什么不同。如果您打印出a的值,则现在为6,但如果您使用a打印出printf("%p\n", (void*)&a);的地址,则前后的地址将相同增量。

答案 1 :(得分:3)

  1. 5是a的值,&aa的地址。

  2. ptr = &a表示a的地址等于ptr的值。

  3. &ptrptr

  4. 的地址

    您可以将ptr视为可以保存地址的框。

    当您递增ptr时,您更改了框内的地址,即ptr;不是盒子本身的地址。