it-swarm.cn

int *我;或int * i;或int * i;

您最喜欢的声明指针的方法是什么?

int* i;

要么

int *i;

要么

int * i;

要么

int*i;

请解释原因。

另请参阅: http://www.stroustrup.com/bs_faq2.html#whitespace

30
lesmana

如果您写:

int* i, j, k;

您会误导所有i,j和k都是int的指针。

因此,我认为将*附加到变量名上是更好的选择。

76
Randall Schulz

我更喜欢 int* i,因为i的类型为“指向int的指针”,我认为这使其与类型系统一致。当然,当尝试在一行上定义多个指针时(即,需要在每个变量名称之前加上星号以声明一个指针)会出现一种众所周知的行为,但是我只是不以这种方式声明指针。另外,我认为这是C风格语言的严重缺陷。

62
Tamás Szelei

对于C,我们不十分关注类型,我更喜欢:

int *i;

因为它在int上有一个后缀,而不是指针。 int是什么? *i是int。

23
alternative

我更喜欢int* i 多年。但是,对于int *i,因为使用前一种样式时,您仍然必须记住多重声明规则:

int* a, *b; // not int* a, b;

因为您必须记住该规则,所以您不会简单地获得任何收益,但是我也不会说它更复杂。避免在一行上进行多个声明只是表达您记住此规则的另一种方式。两种风格之间的区别是没有意义的。

但是,即使在我使用它时,通过将星号放在类型旁边而不是在语法上绑定到的变量旁边,假装C声明语法的工作方式还是有点愚蠢。

我不赞成一种 强调 指针类型(对于i),而另一种强调int类型(对于*i),但是可能是经过15年的C和C++使用,当我看着它时,它只是is,而无需考虑它—大多数提出这个问题的初学者都无法做到。

同样,即使给了我偏好,我也不觉得以其他方式读取/编写代码很尴尬。一致性,bla bla blah。

甚至不必提int * i

7
Roger Pate

我喜欢第一个。很自然,因为指针是该类型的一部分。

当我使用C#时,它以比C更直观的方式处理类型,因此在同一条语句中声明多个指针没有问题:

int* a, b, c; // three pointers
6
Guffa

我更喜欢 int* i(C++样式)。
由于避免了视觉上的歧义,我避免在一个语句中声明多个变量(int* i, j)。

另请参阅 Bjarne Stroustrup的C++样式和技术常见问题解答 了解基本原理。

5
Archimedix

如果要声明多个变量但不想重复星号:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(如您所见,在struct模板中,我更喜欢int* i样式。)

这是一个更通用的解决方案:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

这适用于任何“问题类型”,例如数组和引用:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
4
fredoverflow

我会去int* i;,因为第一部分表示变量类型(指向int的指针),而第二部分表示名称(i)。对我来说,类型是int且名称是*i。另外,int * i;在我看来有点像乘法。

2
Allon Guralnek

在声明中,我使用int * i;,您将其读为i is a pointer to an integer

指针对类型和变量都起作用,因此它应该位于中间。

最好避免在同一行上声明多个内容:int * i, j;

2
Tamara Wijsman

实际上,我在特定情况下使用了所有三个约定。乍一看,我似乎前后矛盾,但是...

  • int *当不存在标识符时,从视觉上强调该名称不存在。
  • typedefs上的int* intptr和类似的声明,从视觉上增强了它是类型的一部分的能力。与函数指针声明类似:(int* (*foo)(int))
  • 函数参数上的int *identifierclass &identifier在视觉上强调该参数可能是所谓的“输出”参数。
  • const int * const * const每当我使用c-v限定词时。
  • int * foo;关于本地声明。

我想我有点视觉导向。

1
greyfade

C中没有指针类型!因此,“ int *”没有任何意义。星号始终绑定到其右写的元素,它属于其右写的元素。 “ * i”是一个整数。并且由于* i是一个int,因此得出i是一个指向int的指针。这就是背后的逻辑,这就是为什么“ int * i”是唯一可能的解决方案的原因。其他一切都是幻觉(在大多数情况下,编译器会自动对其进行纠正)。在C++和C#中是不同的。但是对于C,只有一本圣经:“ Dennis M. Ritchie:C编程语言”。丹尼斯(R.I.P.!)写道:“ int * i”。无需质疑。

1
Lexi Pim