【问题标题】:Where to put the star in C and C++ pointer notation [duplicate]在 C 和 C++ 指针表示法中将星号放在哪里[重复]
【发布时间】:2012-12-15 16:59:00
【问题描述】:

可能重复:
Correct way of declaring pointer variables in C/C++

一段时间以来,以下问题一直困扰着我,我应该将星号放在我的指针符号中的哪个位置。

int *var; // 1

int* var; // 2

显然做同样的事情,两种表示法都是正确的,但我发现我看到的大多数文献和代码都使用第一种表示法。

使用第二种表示法,用空格分隔类型和变量名,而不是混合类型和变量标记,不是更“正确”吗?

【问题讨论】:

  • 如果你从字体的角度来看事物。但 C 的声明语法并非如此。 int* p, q; 声明一个指针和一个普通 int
  • 它们是一样的,这是个人选择,而这个问题既无法回答,又重复了数百次。
  • @DanielFischer:我想给你分数,所以如果我想声明两个指针,我必须输入int *p, *q?
  • 是的,这个想法(我不喜欢它)是“声明模仿使用”。所以你需要为你声明的每个指针加上一个星号,为每个数组加上括号(除非你使用 typedefs 来消除这种需要)。
  • 你正在进入一个宗教狂热的主题。不过我同意你的推理。反例通常类似于“int* p, q”,我会说“那就不要那样做”。

标签: c++ c


【解决方案1】:

没有。绝不。 <g>

但是考虑一下:

int* var1, var2;

这里,* 的位置具有误导性,因为它确实适用于 var2,它是 int 而不是 int*

【讨论】:

  • &const 也一样吗?
  • & 是,const 不是。
  • 我爱上的语言不是我想的那种干净的美。
  • @MartinKristiansen 你会再次注意到十几次......
  • 我很久以前就读过这个问题,并考虑了一段时间,但我得出了这个结论:它必须是“int* var”而不是“int var”,因为这个基本示例:当您注释掉未使用的变量时,请考虑如何注释掉它们:您永远不会这样做:void somefunc(int / var */) {} 对吗?你必须这样做: void somefunc(int /* var */) {}... 因为这个类比,你会在第一个实例中更改函数签名,这是我放置在类型而不是变量上加星号。我只是希望有人能对此有所暗示(踢 QT)
【解决方案2】:

Linux kernel coding style 约定是:

int *ptr1 , *ptr2;

所以我认为你应该采用它作为你的约定。

在声明指针数据或返回指针类型的函数时, * 的首选用法与数据名称或函数名称相邻,而不是 与类型名称相邻。例子:

char *linux_banner;
unsigned long long memparse(char *ptr, char **retptr);
char *match_strdup(substring_t *s);

【讨论】:

    【解决方案3】:

    我相信这种表示法的部分原因是变量的用法和声明看起来很相似。

    int *var;
    int x;
    x = *var;
    

    你也可以认为它是说取消引用 var 会给你一个 int。

    【讨论】:

    • 我认为这是正确的理由。 *& 用于不是定义或声明的语句中的标识符。 x = *var 表示将从var 取消引用的事物分配给x,同样int *var 表示“var 取消引用的事物属于int 类型”。
    • 唉,当我第一次学习 C 时,这种相似性和思维方式让我更加更加对指针感到困惑。直到我开始将指针视为类型,我才理解它们。而且,当然,这个理由根本不适用于 C++ 中的引用。
    • 我认为int *p;*p 的类型为int。奇怪的是,当您考虑可以像 int foo=42; int *p = &foo; 一样初始化 p 时,这里 int* p = &foo; 对我来说更有意义。
    猜你喜欢
    • 2011-07-23
    • 2013-03-31
    • 2015-03-11
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多