C中有指针声明的约定吗?

svr*_*vrs 17 c pointers declaration indirection

声明在C指针,有2个(编辑:3)的变体:

变式A:
__CODE__

变式B:
__CODE__

变式C:
__CODE__

  • 在A中,间接运算符已附加到该类型.
  • 在B中,间接运算符已预先添加到变量中.
  • 在C中,间接运算符在类型和变量之间自由站立.

声明指针的方式因我阅读的文档类型而异.一些作者似乎偏好某些变体,其他人使用几种变体.

  • 我是否正确地假设不同变体之间的功能没有区别?
  • 如果是,是否存在一个变量应该在C中使用的约定?

Kei*_*son 15

其他人没有提到的是那个

int *ptr;
Run Code Online (Sandbox Code Playgroud)

更接近于语言语法.

  • int *ptr;是一个声明,包括:
    • 一个声明说明符 int,其次是
    • 一个声明符,*ptr.

(这实际上跳过了许多步骤,但它得到了基本的想法.)

由于声明遵循使用,这意味着*ptr类型int.由此得出的ptr是类型int*.

有人可能会认为这比它更好

int* ptr;
Run Code Online (Sandbox Code Playgroud)

出于同样的原因

x = y+z;
Run Code Online (Sandbox Code Playgroud)

比...更好

x=y + z;
Run Code Online (Sandbox Code Playgroud)

你当然可以

int* ptr;
Run Code Online (Sandbox Code Playgroud)

并将其读作" ptr是类型int*".而且很多程序员都是这样做的,并且相处得很好(它往往是C++中的首选样式).编译器并不关心你采用哪种方式,任何阅读代码的人都不应该无法理解它.

但无论你选择哪种间距,你都需要了解int *ptr;真正的含义,以便在你看到时

int *ptr, i;
Run Code Online (Sandbox Code Playgroud)

在别人的代码中(你不可避免地会这样),你会立即明白这ptr是一个指针而且i是一个int.

如果您正在与项目中的其他程序员合作,您应该遵循编码标准中的任何现有约定,或者如果没有,那么代码已经编写.我个人更喜欢int *ptr;int* ptr;,但是使用的这两种风格的混合远比使用任何一个持续恶化.


Joa*_*son 12

两者之间的功能完全没有区别

int* ptr;
Run Code Online (Sandbox Code Playgroud)

int *ptr;
Run Code Online (Sandbox Code Playgroud)

你使用哪个是你自己,有多种冲突的编码风格可供选择.

  • 答案并没有解决根本误解,即*与变量名称相关联,而**与类型名称相关联.考虑:`int*a,*b;`vs`int*a,b;` (3认同)

use*_*321 8

只有当您计划在同一行上声明同一类型的多个变量时才重要.例如,如果需要多个int指针,则需要执行以下操作:

int *a, *b, *c;
Run Code Online (Sandbox Code Playgroud)

从风格上来说,当你只声明一个变量时,这会令人困惑.许多人喜欢看到变量名后跟的类型,并且类型应该是指向int的指针,而不是int,所以他们更喜欢:

int* a;
int* b;
int* c;
Run Code Online (Sandbox Code Playgroud)

无论你喜欢一种形式而不是另一种形式,最终取决于你.在专业编程C的20年中,我看到大约50%的人选择一个而不是另一个.


oua*_*uah 6

T *a;
Run Code Online (Sandbox Code Playgroud)

TKernighan&Ritchie关于C的书中以及ISO/IEC 9899:2018中使用的声明指针的首选C样式.

T* a;
Run Code Online (Sandbox Code Playgroud)

TStroustrup关于C++的书中使用的声明指针的首选C++样式方式.

两种符号都是等价的.

  • +1给上诉权;-) (2认同)

Dav*_*nan 5

它们的意思与其他人所说的相同.虽然有一个陷阱等着你.考虑以下代码:

int* a, b;
Run Code Online (Sandbox Code Playgroud)

你可能会认为这是指向的int.不然,不然.事实上aint*,但是bint.这是许多C程序员更喜欢将*下一个变量放在变量而不是类型上的原因之一.这样写的时候:

int *a, b;
Run Code Online (Sandbox Code Playgroud)

你不太可能被误导为什么ab是什么.

说了这么多,许多编码标准坚持要求每行声明不超过一个变量,即e.

int* a;
int b;
Run Code Online (Sandbox Code Playgroud)

如果你遵循每行规则的一个变量,那么肯定没有混淆的余地.