【问题标题】:Pointer syntax in C [duplicate]C中的指针语法
【发布时间】:2013-01-26 11:51:38
【问题描述】:

可能重复:
In C, what is the correct syntax for declaring pointers?
good way to write “pointer to something” in C/C++

我目前正在阅读一本关于 C 的书。目前我正在阅读有关指针的书籍。

基本上,我认为我已经理解了这个概念。无论如何,有一件事让我感到困惑:

作者有时会使用

void *foo;

创建一个新的指针,但有时是

void* foo;

有区别吗?有关系吗?不是吗?什么时候用什么? ...?

【问题讨论】:

  • 没有技术差异。但这并不能阻止人们永远争论它。最后,这只是个人喜好。
  • 请记住* 绑定到声明符,而不是类型说明符; IOW,void* foo; 被解析为void (*foo);

标签: c pointers syntax


【解决方案1】:

您可以根据需要在 * 的两侧添加任意数量的空格。无论哪种方式,它的含义都完全相同:

void*foo;
void *foo;
void* foo;
void * foo;
void                     * foo;
void *                     foo;
void           *           foo;

一切都是一样的。如果您在一个项目上工作,通常会有一些“编码风格标准”来解释该项目中哪个是首选。但是编译器不会根据是否/在哪里有空格来做任何不同的事情。

【讨论】:

  • 不,他们不完全是最后一个示例有错字。 SCNR。
【解决方案2】:

它们是等价的,但在一行中声明多个非 void 类型的变量时,前者可能更可取

int *foo, *bar;

明确声明了两个指针,而

int* foo, bar;

声明一个指针和一个int

【讨论】:

    【解决方案3】:

    两者是等价的,没有任何区别。

    int *foo, i;
    

    但是你应该知道上面声明的区别。这里只有foo 是指针类型,而iint 类型(不是int*)。

    【讨论】:

      【解决方案4】:

      这两种语法是等价的。唯一的区别是风格问题。

      【讨论】:

      • 看看其他类似的答案。这个答案在技术上是正确的,但非常简洁。如果您要回答重复,至少要让它成为一个好的答案,而不仅仅是忽略重要一点的最低限度。你的回答比我的评论说的
      • @Flexo:当我发布了这个(并且当出现了downote)时,不再有答案。此类问题没有明确的答案。因此,我认为这些“解释”就足够了。
      【解决方案5】:

      编译器没有区别,你可能已经知道了。

      关于风格,有些人认为void* ptr 更好,因为类型名称作为一个整体是孤立的。问题是,这不是 语言 的工作方式:

      int*  ptr, otherptr; /* otherptr is not a pointer here */
      

      即使您决定不一次声明多个变量,使用独立类型名称的整个想法也会破坏数组和函数指针。这就是为什么我更喜欢另一种风格:

      int *ptr, *otherptr, dontDeclareTooManyThings[N];
      

      【讨论】:

        【解决方案6】:

        有区别吗?

        当然有。 (如果没有,您就不会问这个问题。)在第一种情况下,星号位于空白的一侧,而在另一种情况下位于另一侧。

        重要吗?

        确实如此。然而,不是在程序逻辑方面 - 两者的解析方式完全相同。但是,这是个人喜好问题。我一般推荐第二种方式, i. e. void *ptr,因为指针限定符(星号)修改的是变量,而不是类型。

        什么时候用什么?

        刚刚解释过。

        【讨论】:

        • 星号也可以看作是类型修饰符。因此,您可以将 void* ptr 读为“ptr 的类型是 void 指针”,即指向任何东西的指针,然后类型转换为确切的类型指针。
        【解决方案7】:

        两种变体均有效。 它们代表不同的风格。

        考虑

        char* foo, bar;
        char *foo, bar;
        

        在这两种情况下 foo 都是一个指针,而 bar 不是。

        还要考虑(可读性)

        char* foo() {
            // return something
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-05
          • 1970-01-01
          • 2012-12-16
          • 1970-01-01
          相关资源
          最近更新 更多