【问题标题】:Declaring C Pointers - Why do we use * and not & [closed]声明 C 指针 - 为什么我们使用 * 而不是 & [关闭]
【发布时间】:2014-02-17 15:11:59
【问题描述】:

我的问题是关于指针声明的 c 语法的一个简单问题(我希望如此)。我对如何声明一个指针,它是如何使用的以及效果是什么,我很清楚,如下所示。

int *val_ptr;
int val =99;

val_ptr = &val;

然而,令我困惑的是为什么当我们在 C 中声明一个指针时,我们使用 * 间接(值)运算符?而不是运算符的 & 地址。如果我们声明一个指针,用 & 这样做是不是没有意义,因为我们声明了一个地址,对吗?示例:

int & val_ptr;
int val =99;

val_ptr = &val;

我知道这是不正确的,但在我看来这似乎更直观。我对 * 运算符的概念中缺少什么。我还没有找到一本可以解释原因的教科书,它们只是说明了如何。我知道怎么做,我想知道为什么。

感谢阅读。

【问题讨论】:

  • “为什么?”有一个正确答案:因为标准是这样说的。
  • 这不是programmers.stackexchange.com/的问题吗?
  • 这个问题似乎是题外话,因为它属于programmers.stackexchange.com
  • @AndrewS 您似乎在要求我们深入了解 Ritchie 等人的想法。除了“创作者认为如此”之外,我们无法为您提供明确的答案
  • @AndrewS:IMO 无法按照 StackOverflow 的标准回答这个问题,但这本身并不是一个坏问题——只是不适合这个网站(programmers.stackexchange 会更好)。你不应该投反对票,但这是互联网。人们会做任何事。

标签: c pointers value-of indirection


【解决方案1】:

指针声明语法试图模仿指针的使用。当你有

int *ptr;

那么*ptr的类型是int。

【讨论】:

    【解决方案2】:

    声明模仿使用。如果您有一个指向整数的指针并且想要访问指向的值,您可以使用 * 运算符取消对指针的引用,如下所示:

    x = *p;
    

    表达式的类型*p是int;因此,p 的声明应该是

    int *p;
    

    【讨论】:

      【解决方案3】:

      当你写作时:

      int *mypointer;
      

      你可以这样想,“我声明 (*mypointer) 是一个 int”(即“我的指针将引用一个 int”),如下所示:

      int (*mypointer);
      

      现在看,

      int (&mypointer);
      

      没有意义。你在说什么? “我的指针值的地址是一个 int”(这是真的,但这不是你的意思)。

      【讨论】:

        【解决方案4】:

        您不能使用 & 运算符在 C 中声明指针。标准不允许这样做。当您在 C 中声明指针时:

        int *val_ptr;  
        

        那么声明中的* 不是解引用(间接)运算符。但是当这个* 出现在一个语句中时,它就会执行间接寻址。

        【讨论】:

        • 我知道,我在我的 OP 中提到了这一点。但为什么是这个标准,似乎有悖常理。我确信这有一个概念上的原因,我只是想看看是否有人知道。
        • 你能解释一下为什么1被读作One而不是Apple吗?这背后有什么我不知道的原因吗?
        • @AndrewS 我认为牛顿定律和 C 之间的区别在于后者完全是由人类设计的。这意味着他们可以为所欲为,不受任何自然法则逻辑的指导。所以问为什么这样做是没有意义的。其他人类创造的例子:为什么加法的数学运算符看起来像“+”而减法看起来像“-”?为什么不反过来呢?这背后有什么逻辑吗?
        • @AndrewS 您会惊讶于计算历史中有多少纯粹是巧合,或者只是从某个前辈那里继承而来。不过,这里的答案是(正如 Wojtek 在这里回答的那样)这是因为在 int *j; 中存在对称性,表达式 *j 产生一个 int,并且该设计在某种程度上被记录在 here 中。请注意,您的问题是以非常主观的方式表达的,没有人知道或关心为什么使用 * 会让您感到困惑。
        • 这个问题最能解决我的问题,它澄清了我的一些误解,即当用于声明变量时,它实际上不是间接运算符,而只是表示类型是指针。 A 实际上在复古计算论坛上问了这个问题,在得到了否定的回应之后,并得到了一个完整清晰的简短回答,有人真正理解了语言实现。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多