代码之家  ›  专栏  ›  技术社区  ›  Feyyaz Phill Pafford

类型声明-指针星号位置

  •  32
  • Feyyaz Phill Pafford  · 技术社区  · 14 年前

    在C++中,下面的意思是“为int指针分配内存”:

    int* number;
    

    因此,星号是变量类型的一部分;如果没有它,就意味着“为int分配内存”。

    那么,如果下面的意思是“为两个int指针分配内存”,这不是更有意义吗?

    int* number1, number2;
    
    5 回复  |  直到 6 年前
        1
  •  58
  •   Jonathan Leffler    6 年前

    有人问他这个问题,他说(转述)

    • 如果你觉得更性感,你会说 iT*A 员工*体育 (所以在你的头脑里,你在想 是整数“)
    • 如果你想更多的C++,你会说 iT*A 员工*体育 (所以在你的头脑里 是一个整数指针“)

    你想怎么想就怎么想,只要你不申报两个 指针在同一行上。

    为我工作。我是一个 Employee* pE 是那种人,但我嫁给了一个 Employee *pE 我的建议是不要太激动。

        2
  •  22
  •   kennytm    7 年前

    实际上,星号附加到变量上(从C继承的约定),所以

    int * number1, number2;
    

    声明 number1 作为指向 int (即 *number1 是一个 int ) number2 作为一个 int .

    间距对 number 已键入的。它只是一个令牌分隔符。以下所有内容对于编译器都是相同的,因为在解析之后空间将被剥离。

    int *a;
    int*a;
    int* a;
    int * a;
    int/**a***/*/*a***/a;
    

    使用

    int* number1, *number2;
    

    为了创建两个指针,或者更好,将其拆分为多个声明以避免混淆。

    int* number1;
    int* number2;
    
        3
  •  18
  •   AnT stands with Russia    13 年前

    您过于简单化C++声明的结构(即使您所做的点是完全合乎逻辑的)。只有在第一种情况下,C++声明看起来是由类型名称和逗号分隔的实体名称序列组成的,但实际上C++(以及C)声明实际上是由类型名称和序列组成的。 声明符 . 您声明的实体的完整类型信息在 单独的位置和部分实际上是声明器的一部分。它只是C++中的方式。为了更好地反映声明的实际结构(如语言所见),最好将声明格式化为

    int *a, *b;
    

    即显式分组 * 具有实体名,而不是类型名。(但归根结底,这是个人喜好的问题。)

    至于为什么它在语言中是这样设计的,正如你在评论中所问的那样…如您所知,描述所声明实体类型的声明语法部分可以出现在名称的左侧(如 * & )以及在其右侧(如 () [] )就像在

    int *f(), (&g)[5], h[2][2];
    

    对于出现在右边的位,用任何其他方法都是不可能的。它们别无选择,只能用实体名而不是类型名分组。人们可能会问为什么上述声明不在C++中完成

    int *() f;
    int (&)[5] g;
    int [2][2] h;
    

    (即,所有与类型相关的内容都显示在紧凑组的左侧)这个问题的答案就是它是C++的方式。这种方法是从C继承而来的,这里的“声明必须类似于使用”经常被引用作为理由。

    另一件需要记住的事情(以及经常被错误地解释的)是,声明中与类型名相邻的限定符是通用的 类型 不是第一个单独声明者的一部分。例如

    int const *a, *b;
    

    声明 const int *a const int *b 不是 int *b 就像有些人可能错误地相信的那样。出于这个原因,我个人更喜欢使用更符合逻辑的

    const int *a, *b;
    

    订购(尽管同时我更喜欢分组 * 用名称,而不是用类型)。

        4
  •  8
  •   Community Jaime Torres    7 年前

    这只是C声明语法中许多不规则之处之一。类型修饰符 * 是类型的一部分,但在语法上它属于声明的标识符。
    同样的道理也适用于 & [] BTW.

    here 为什么 * 除了修改类型。

        5
  •  3
  •   Eli Bendersky    14 年前

    不,

    int* number1, number2;
    

    声明 number1 作为指向 int number2 作为一个 int . 就我个人而言,我更喜欢将星号附加到类型上,这正是您在这个问题中提出的gotcha的问题,因此我将声明如下两个指针:

    int* number1;
    int* number2;