【问题标题】:Type Declaration - Pointer Asterisk Position类型声明 - 指针星号位置
【发布时间】:2010-04-24 10:56:33
【问题描述】:

在 C++ 中,以下表示“为 int 指针分配内存”:

int* number;

所以,星号是变量类型的一部分;没有它,这将意味着“为 int 分配内存”。

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

int* number1, number2;

【问题讨论】:

标签: c++ pointers


【解决方案1】:

Stroustrup 被问到这个,他说(释义)

  • 如果你认为更多的是 C-ish,你会说 int *aEmployee *pE (所以在你的脑海里你在想“a 的内容是一个整数”)
  • 如果你认为更多的是 C++-ish,你会说 int* aEmployee* pE (所以在你的脑海中它是“a 是一个整数指针”)

你可以随心所欲,只要你从不声明两个 指针在同一行。

为我工作。我是 Employee* pE 类型的人,但我嫁给了 Employee *pE 类型的人 - 我的建议是不要为此过于激动。

【讨论】:

    【解决方案2】:

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

    int * number1, number2;
    

    number1 声明为指向int 的指针(即*number1int),并将number2 声明为int

    间距对number 的键入方式没有影响。它只是用作标记分隔符。以下所有对编译器都是一样的,因为解析后空格会被剥离。

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

    使用

    int* number1, *number2;
    

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

    int* number1;
    int* number2;
    

    【讨论】:

    • 谢谢,但我不是在问我应该怎么写。我在质疑为什么编译器是这样设计的。是什么让这种语法更合乎逻辑。
    • @sahs:除了“一直都是这样”之外,没有什么好的理由。这不是那么合乎逻辑,而是历史。我们从 C 中继承了这个声明语法已有 40 年的历史,并且远远早于当今被认为是好的语言设计的大部分内容。
    • 太棒了!!!它解决了我一万年的困惑。但是G,为什么人们经常把指针和非指针混在一起……
    【解决方案3】:

    您过度简化了 C++ 声明的结构(即使您提出的观点完全合乎逻辑)。乍一看,C++ 声明似乎由类型名称和逗号分隔的实体名称序列组成,但实际上在 C++(以及 C)中,声明实际上由类型名称和 声明符。您声明的实体的完整类型信息在 两个 单独的位置之间拆分,其中一部分实际上是其声明符的一部分。这就是它在 C++ 中的方式。为了更好地反映声明的实际结构(如语言所见),最好将声明格式化为

    int *a, *b;
    

    即将*s 与实体名称明确分组,而不是与类型名称。 (但归根结底是个人喜好问题。)

    至于为什么在语言中以这种方式设计,正如您在其中一个 cmets 中所问的那样......如您所知,描述被声明实体类型的声明语法部分可以出现在名称的左侧(如*&)以及其右侧(如()[]),如

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

    对于出现在右侧的位,根本不可能以任何其他方式进行。他们别无选择,只能与实体名称而不是类型名称进行分组。有人可能会进一步问,为什么上述声明没有在 C++ 中完成

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

    (即所有与类型相关的东西都出现在紧凑组的左侧)...嗯,这个问题的答案就是它在 C++ 中的方式。该方法继承自 C,因此“声明必须类似于使用”经常被引用为基本原理。

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

    int const *a, *b;
    

    声明 const int *aconst int *b,而不是 int *b,因为有些人可能会误认为。出于这个原因,我个人更喜欢使用更合乎逻辑的

    const int *a, *b;
    

    排序(尽管同时我更喜欢将 * 与名称分组,而不是与类型)。

    【讨论】:

    • *&()[] 与他们描述的关于那个变量的名称组合起来似乎更合乎逻辑,尽管他们修改了它类型,但不是同一行中所有其他变量的类型;同样,限定符与该行中声明的所有变量相关联,因此 commong 因此在它们前面加上 type 似乎是正确的。我一直在做这件事时没有考虑其基本原理,现在我知道了,所以我会继续坚持下去,即使有人认为我是伪装成 C++ 程序员的 C 程序员。
    • Marshall Cline 在回答similar FAQ 时使用讽刺(见最后) 指出这种偏见是不对的。
    【解决方案4】:

    这只是 C 声明语法的许多不规则之处之一。类型修饰符 * 是类型的一部分,但在语法上它属于声明的标识符。
    &[] 也是如此,顺便说一句。

    请参阅 here 了解 * 除了修改类型之外的作用。

    【讨论】:

    • 这不是 C 语法的不规则性。这是声明遵循使用的常规语法的一部分。这个答案是基于对声明看起来像的 C 语法的误解:<type> <name>。这不是 C 声明语法的工作原理,如果您认为您会反复感到困惑并发现违规行为。
    • @Peaker:我在 1992 年左右学会了不喜欢 C 的声明语法。我第一次赚钱是在 20 年前编写 C++ 代码(使用 C 的声明语法)。然而,由于习惯和经常使用二十多年,我可以立即(大部分)理解它,并且我喜欢 C++,这并不能阻止我认识到声明语法是完全失败的,这只能原谅以其巨大的古老性。你也应该学会区分你通过不断接触而习惯的坏事和马上就会被认出的好事。继续学习!
    【解决方案5】:

    不,

    int* number1, number2;
    

    number1 声明为指向int 的指针,将number2 声明为int。就个人而言,我也更喜欢将星号附加到类型上,这正是你在这个问题中提出的问题,所以我将声明两个指针如下:

    int* number1;
    int* number2;
    

    【讨论】:

      猜你喜欢
      • 2010-09-15
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多