【问题标题】:Confusion about the nature of * operator [closed]对 * 运算符的性质感到困惑 [关闭]
【发布时间】:2013-08-29 19:06:53
【问题描述】:

我对以下两个声明感到困惑:

int *p=&a; //first

int *p; //second
p=&a;

Asterisk * 没有充当解引用运算符。我见过的大多数地方 * 充当取消引用运算符。我的问题是,除了第一种情况,是否有 * 运算符不充当取消引用运算符的任何情况?

【问题讨论】:

  • 乘法运算符?
  • @nouney 你一定是在开玩笑......
  • 在任何情况下 * 运算符不充当取消引用运算符???,来自你的问题老兄
  • @nouney 哦,来吧,太明显了(乘法运算符)。
  • 很难说你在这里问什么。这两个示例是相同的,只是第一个案例将p 初始化为声明的一部分,而第二个案例在声明之后立即为p 赋值。但是您似乎在问:“除了类型声明和乘法之外,是否有任何情况 * 不是取消引用运算符?”那么,您是否对声明感到困惑,或者想知道* 的其他用途?

标签: c dereference


【解决方案1】:

* 仅在表达式中充当解引用运算符

C 声明的(诚然奇怪的)语法是基于“声明遵循使用”的思想。所以这些声明:

int i;
int *p;

可以读作“i 是一个int”并且*p 是一个int。由于*pint,那么p 必须是指向int 的指针。

(当然*如果出现两个操作数也是乘法运算符。)

【讨论】:

    【解决方案2】:

    在声明语句中* 被认为不是解引用运算符,而是类型说明符的一部分。 int *p 表示p is a pointer to int,你的第一行也将它初始化为a 的地址。第二行在普通的赋值语句中将a的地址赋值给p

    p 仍然只是一个持有某些东西的变量。最好将其他变量的地址分配给它,但是您可以为它分配任何您想要的东西(不过有些编译器会使其变得困难),然后通过取消引用它来使您的程序崩溃!

    【讨论】:

      【解决方案3】:

      尽管 C 标准中的正式定义不同,* 确实在声明中充当取消引用运算符。 C 声明背后的概念是它们显示表达式将具有的类型。例如,int *p; 本质上是说“当我取消引用 p 时,结果应该是 int。”

      所以,虽然这不是一个尊重 p 的表达方式,但它是一个说明。

      【讨论】:

      • 我同意你的观点,要取消引用指针p,我们写*p,而p 表示指针变量本身,*p 表示指针指向的int
      【解决方案4】:

      & 运算符返回变量a 的内存地址,因此p 将指向变量a 的内存位置。

      * 运算符称为 indirectiondeference 运算符。它返回指向的内存位置的内容。

      int *p; p 被声明为指向int的指针
      p = &a; p 将指向a的地址

      【讨论】:

        猜你喜欢
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多