【问题标题】:Does a pointer also have any address or memory allocation?指针是否也有任何地址或内存分配?
【发布时间】:2009-06-13 17:15:50
【问题描述】:

如果一个指针存储了一个变量的地址……那么我们从哪里得到指针呢?

我问的是,如果我们直接使用指针,那么一定有一个位置从哪里得到这个指针?

【问题讨论】:

  • 重新标记的帖子。红宝石?来吧。
  • 就目前而言,你的问题几乎没有意义。
  • 我几乎回答了你的问题,还有几个人向你展示了一些例子。还有什么需要的吗?
  • 您从 API 或其他变量中获取指针。如果您不对特定指针进行初始化或赋值,它可以指向任何地方。换句话说,你的直觉是正确的:指针值必须来自某个地方。
  • 在我的评论中用函数替换 API。

标签: c pointers


【解决方案1】:

是的,声明的指针在内存中有自己的位置。

在上面的示例中,您有一个变量“b”,它存储值“17”。

int b = 17;    /* the value of 'b' is stored at memory location 1462 */

当您创建一个指向该变量的指针时,该指针存储在它自己的内存位置

int *a;
a = &b;       /* the pointer 'a' is stored at memory location 874 */

知道从哪里“获取指针”是编译器的工作。当您的源代码引用指针'a'时,编译器会将其转换为->“存储在内存位置874中的任何地址值”。

注意:这个图在技术上是不正确的,因为在 32 位系统中,指针和 int 都使用四个字节。

【讨论】:

  • 指向 NULL 字段的指针呢?特别是在递归抽象数据类型中。 -- 我正在学习链表。链表实际上是无限数量的指针(递归节点)。那些会占用内存吗?还是空值不占内存?
【解决方案2】:

是的。下面我有一个 int 和一个指向 int 的指针以及打印出每个内存地址的代码。

int a;
printf("address of a: %x", &a);

int* pA = &a;
printf("address of pA: %x", &pA);

指针,在 32 位系统上,占用 4 个字节。

【讨论】:

    【解决方案3】:

    查看这篇 SO 帖子以更好地理解指针。 What are the barriers to understanding pointers and what can be done to overcome them?

    就你的问题而言,如果我理解你想要什么,那么基本上,当你声明一个指针时,你指定一个地址或一个数字索引,分配给系统中的每个内存单元(通常是一个字节或一句话)。然后系统提供一个操作来检索存储在该地址的内存中的值。

    【讨论】:

      【解决方案4】:

      在 C 中:

      char *p = "Here I am";
      

      p 然后存储存储“H”的地址。 p 是一个变量。你可以拿一个指向它的指针:

      char **pp = &p;
      

      pp 现在存储p 的地址。如果你想获取pp 的地址,那就是&pp 等等。

      【讨论】:

        【解决方案5】:

        编译器负责将代码中的变量转换为机器指令中使用的内存位置。

        指针变量的位置取决于它在代码中的声明位置,但程序员通常不必直接处理。

        在函数内部声明的变量存在于堆栈或寄存器中(除非它被声明为静态)。

        在顶层声明的变量位于程序顶部的一段内存中。

        声明为动态分配的结构或数组的一部分的变量位于堆上。

        & 运算符返回变量的内存位置,但与* 运算符不同,它不能重复。

        例如,***i 获取地址**i 处的值,即地址*i 处的值,即存储在i 中的值,编译器会计算出如何找到它。

        但是&&i 不会编译。 &i 是一个数字,它是编译器用于变量 i 的内存位置。这个号码没有存储在任何地方,所以&&i 没有意义。

        (注意如果源代码中使用了&i,那么编译器不能将i存储在寄存器中。)

        【讨论】:

          猜你喜欢
          • 2015-08-31
          • 2014-10-03
          • 1970-01-01
          • 1970-01-01
          • 2020-08-15
          • 2021-10-02
          • 2019-02-11
          • 2023-03-08
          • 1970-01-01
          相关资源
          最近更新 更多