【问题标题】:Where are pointers stored in?指针存储在哪里?
【发布时间】:2014-10-23 10:02:06
【问题描述】:

假设我们声明并初始化了一个全局变量:

short var = 3900;

并分别存储在堆栈中:

...[][][][][][][][15][60][][][]... (60 + (15*256) = 3900)

那么新的变量指针将如何/在哪里存储?

int p = &var;

地址是否像普通整数一样存储?持续的?依赖类型? (如果指针是char类型并且指向的值是int,gcc不会报错。它怎么会在1个字节中分配大量数字?优化?


编辑:哦,我明白了。 考虑一下:

int num = 5;
char* p = #

p是指针,指针是比较多的字节,可以表示这么大的地址。 除此之外.. *p 是 char 并且不能表示比 256 更大的数字。5 很好。

【问题讨论】:

  • 是的,地址的存储方式与 int 完全相同(在普通的 32 位系统上)。是的,变量的地址在程序存在的整个过程中都是不变的。
  • 它像其他原始类型一样存储。
  • 它依赖于类型吗?正如我在沿 gcc 的 C::B 中看到的那样。如果指针是 char 类型并且指向的值是 int,它不会返回任何问题
  • 注意:作为地址的指针不一定总是可以作为 int 保存
  • @BLUEPIXY 你是什么意思?

标签: c pointers memory memory-management


【解决方案1】:

它们也像普通整数一样存储。 让这些框是每个 4 字节的内存空间。

[]
[]
[]
[]
[]

short var = 3900;内存后变成

[3900]
[]
[]
[]
[]

当你声明int p = &var;

[3900] //Let the address be 0x7fff9575
[0x7fff9575] //stores the address of where var is stored. It is actually an integer "2147456373" value 
[]
[]
[]

希望这会有所帮助。

编辑:这是针对 32 位架构的。

【讨论】:

  • 地址必须是十六进制的吗?你是说它们是一致存储的吗? (即在内存中彼此相邻)
  • 不,它不是,但为了简单起见,它是这样写的。实际上在内存中它们都是二进制的。
  • 是的,就像我想的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2019-08-03
  • 2014-05-04
  • 1970-01-01
  • 2021-07-18
  • 2014-11-14
相关资源
最近更新 更多