【问题标题】:Pointer dereference in an assignment赋值中的指针取消引用
【发布时间】:2013-05-13 00:30:54
【问题描述】:

我正在看一场讲座,当教授说 ptr=&x 表示一个变量ptr 分配了变量x 的地址。 对于y=*ptr+1,他说*ptr 表示存储在x 的值(或x 的值)。 我在这里有点困惑,因为*ptr 应该指向x 的地址,对,而不是存储在x 的值?有人可以详细说明一下吗?

【问题讨论】:

  • *ptr 指的是存储在ptr 的条目。请参阅此处以获取说明en.wikipedia.org/wiki/…
  • ptr指的是变量x的地址。 *ptr 指的是内存中x 地址处的值。 *ptr = *(&x) = x.
  • 这是一个关于行为具体的 C 代码的问题,而不是关于 C 语言的语义的问题。这是一个编程问题而不是计算机科学问题,所以我将其迁移到Stack Overflow
  • 你必须看到this

标签: c pointers variable-assignment


【解决方案1】:

考虑一下,

int a = 10;

现在,在内存中我们有类似的东西

                   +------+
                   |      |
                   |  10  |
                   |      |
                   +------+
               0x121  a

现在,考虑一个int类型的指针变量

int* ap = &a;

这看起来像,

                +-------+
                |       |
                |  10   |
                |       |
          0x121 +-------+
                    a  

                +-------+ 
                |       |     
                | 0x121 |
                |       |
                +-------+
                   ap

a 是内存位置的标签,ap 是地址。要获取该地址的值,请使用*。这称为取消引用指针。

*ap 

这会给你10

在指针上阅读一些好的tutorial

【讨论】:

    【解决方案2】:

    ptr 指向x,而不是*ptr*ptr 甚至不是指针(假设 x 不是指针)。

    变量ptr包含一个指向变量x的指针,即变量x的地址。表达式ptr 的值是指向x 的指针。表达式*ptr 的值是ptr 指向的位置的值:这就是解引用运算符* 的含义。因为ptr指向x,所以*ptr的值就是x的值。

    【讨论】:

      【解决方案3】:

      指针指向存储值的地址。

      int *ptr;
      int x = 2;
      ptr = &x;
      

      这里,ptr 是一个 int 指针,x 是一个 int(很明显)。如果我们希望 ptr “跟踪” x 的值,那么我们为 ptr 分配 x 的 地址。因此,当我们取消引用 ptr 时,我们会获得存储在 ptr 指向的地址的值。因此,如果我们想更改 ptr “存储”的值,那么我们取消引用它。

      *ptr = 5;
      

      这会将 ptr 指向的地址的值从 2 更改为 5。

      【讨论】:

        【解决方案4】:

        给定:

        int x = 42;
        int *ptr = &x;
        

        x 是一个整数对象(int 类型),ptr 是一个指针对象(int* 类型或pointer-to-int)。

        一元& 是地址运算符。将其应用于FOO 类型的对象会为您提供该对象的地址(或等效地,指向该对象的指针);该地址/指针值的类型为FOO*,或pointer-to-FOO。一元&的操作数必须是一个对象的名字,而不仅仅是一个值; &42 是非法的废话。 (符号&也用于二进制位and运算符,与地址运算符完全无关。)

        一元 *dereference 运算符,是 & 的倒数。它的操作数必须是某种指针类型的值。 *ptr 指的是ptr 指向的对象。

        鉴于上述声明,假设ptr 的值没有改变,表达式x*ptr 意思相同;它们都引用同一个 int 对象(其值恰好是 42)。同样,表达式&xptr 表示相同的意思;它们都产生x的地址,该地址已存储在指针对象ptr中。

        需要注意的是*ptr 不仅仅指x 的当前,它指的是对象x 本身——就像名称x做。如果您在值上下文中使用*ptr,这无关紧要;你只会得到x 的值。但是,如果您在作业的左侧使用它,例如,它不会评估为42。它评估对象x 本身,并允许您修改该对象。 (这里的区别是*ptr是否被用作左值。)

        【讨论】:

        • 第一个摘录有错吗
        • @AnttiHaapala:不再是了。谢谢!
        【解决方案5】:

        变量ptr 存储x地址。为了检索存储在x 中的值,我们取消引用 ptr 与一元* 运算符;因此,表达式 *ptr 的计算结果为 x 的值。

        换一种说法,如果

         p == &x;
        

        然后

        *p == x;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多