【问题标题】:Why is the Dereference operator used to declare pointers?为什么要使用 Dereference 运算符来声明指针?
【发布时间】:2021-12-16 12:10:07
【问题描述】:

为什么*用来声明指针?

它删除了间接,但是当你声明像int *a = &b这样的指针时不会删除任何东西,它不应该删除&b的间接吗?

【问题讨论】:

  • 该字符* 在表达式和声明中的含义完全不同。在表达式中,它是一个取消引用运算符。在声明中,它更像是一个 this-is-a-pointer 修饰符。
  • 在声明中,它根本不是运算符。
  • 你有没有想过为什么42 * 4中没有去除间接性?
  • 你已经接近了,但你并不完全按照预期的方式阅读 C 声明:int *a; => int, *a => 表达式 *a 产生 @987654330 @。 C 中的声明旨在模拟这样的使用。

标签: c++ c pointers syntax declaration


【解决方案1】:

C 和 C++ 中的许多符号都被重载。也就是说,它们的含义取决于使用它们的上下文。例如,符号& 可以表示地址运算符和二进制位与运算符。

声明中使用的符号*表示一个指针:

int b = 10;
int *a = &b,

但用在表达式中,当应用于指针类型的变量时,表示解引用操作符,例如:

printf( "%d\n", *a );

它也可以表示乘法运算符,例如可以这样写:

printf( "%d\n", b ** a );

与此相同

printf( "%d\n", b * *a );

同样地,这对方括号可以用在数组的声明中,比如:

int a[10];

并作为下标运算符:

a[5] = 5;

【讨论】:

    【解决方案2】:

    任何时候你有一个像这样初始化的指针声明:

    type *x = expr;
    

    相当于单独初始化后赋值:

    type *x;
    x = expr;
    

    等同于

    type *x;
    *x = expr;      /* WRONG */
    

    【讨论】:

      【解决方案3】:

      它是声明的一部分,所以它根本不是解引用运算符。但它仍然意味着同样的事情。

      int *a
      

      可以读作

      a 指向的值是一个int

      就像

      printf("%d\n", *a);
      

      可以读作

      打印a指向的值。

      请参阅this answer在 C/C++ 中声明指针变量的正确方法,了解这方面的背景知识。

      【讨论】:

      • 它实际上“是”一个解引用运算符。不是在执行取消引用操作的意义上,而是因为它仍然具有其取消引用的含义。正如 K&R 解释的那样,声明器展示了如何使用标识符的图片。 int *a 表示*a 将用作int,这意味着当解引用运算符应用于a 时,结果类型为int。所以int *a中的*是解引用操作符,只是为了它的意义,而不是为了执行它的计算。
      • 它实际上不是解引用运算符。您不能在声明中将表达式放在 = 的左侧。但它确实充当取消引用,是的,这就是我的回答已经说过的。
      【解决方案4】:

      当 C 被发明时,做出了一个有点有趣的选择。变量的声明方式类似于它们的使用方式。

      所以

      int a;
      

      意思是“你可以从a中得到一个int。那么,

      int *a;
      

      表示您可以从*a 中获得int

      还有,

      int a[3];
      

      表示您可以从a[index] 中获得int;在这里,大小放在索引所在的位置。

      这可以链接到复杂的案例

      int *a[3];
      

      int (*a)[3];
      

      现在如果你不知道 C 解析是如何工作的,这是不透明的;但至少你只需要学习一次!

      这就是为什么有些人认为int* a 是不好的形式,因为* 真正附加到a 而不是int

      命名变量的初始化是另一回事。

      (some declaration) = (some expression)
      

      声明中的符号从不充当表达式。它们是相同的符号,只是含义不同。

      【讨论】:

        猜你喜欢
        • 2012-01-30
        • 2023-01-11
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-25
        • 1970-01-01
        • 2021-08-17
        相关资源
        最近更新 更多