int *我; 或int * i; 或int * i; [关闭]


30

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

int* i;

要么

int *i;

要么

int * i;

要么

int*i;

请解释原因。

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


19
我宁愿关注其他3000行...

29
int*i;-空格不会在树上生长,您知道...
Shog9

本质上是同样的问题; 这是我的答案
基思·汤普森

Answers:


75

如果您写:

int* i, j, k;

您会误导我说i,j和k都是指向的指针int

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


35
我建议int * i;是一个非竞争者,因为它乍一看就像乘法。
约翰·K

1
+1是因为我之前没有考虑过这种情况。
流行

4
“您会误导所有i,j和k都是指向int的指针。” 除非您正在编写C#,否则where int*被视为一种类型,并且int* i, j确实声明了两个指针。该问题可能被认为是不完整的-它取决于您所使用的语言,哪些样式是合理的。在CI中int *x,在C#中,否则执行其他操作。
Joren

1
@Joren:对不起,不是C#程序员,我只是通过查看问题中的代码片段是C还是C ++来假定。
兰德尔·舒尔茨

我认为,除非特别提到C#,否则假设其C或C ++是完全合理的。人们很少会在C#中看到指针。
可替代

62

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


8
我也遵守这个约定。出于同样的原因。
gablin

5
就个人而言,如果我在代码中声明多个指针,则将其视为代码气味。我不需要那么多指针。通常,我不会。因此,在我编写的任何代码中都不会出现单行多个声明的问题:每行一个声明。
greyfade

5
问题在于类型不是“指向int的指针”。C(和C ++)没有指针类型。它是指向内存块的指针,该内存块的类型为int。
Billy ONeal

10
我认为这*i是一种int
蒂姆·古德曼

5
@Billy:如果是这样,我在尝试理解,解析和解释标准语言的12年中从未见过这种困惑。在C和C ++中,“指向int的指针”是完全有效的类型。

23

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

int *i;

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


2
好点子。使用指针,您可以将开头视为名称的一部分。例如,如果有int i = 5,要获取的值i,请使用name i。同样,如果您拥有int *i; *i = 5,那么您可以使用获取值*i
mipadi

我将int * i读为:* i是int。因此,我是int的指针。C语言中的变量声明使用类型表达式,int和*只是运算符。int * i解析为int(*(i))并被解释为i具有指向整数的指针。char * p []解析为char(*([](p)))(因为[]的优先级高于*),并且意味着:p具有指向char的指针数组。
乔治

因此,我认为他们选择在变量旁边写*,因为*是对其应用的运算符。
乔治

7

我已经首选int* i了多年。但是,有一个很强的论据,int *i因为使用前一种样式时,您仍然必须记住多重声明规则:

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

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

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

我不买成一个强调指针类型(i),而其他强调int类型(的*i),但是这可能是15年后的C和C ++使用的,它只是,当我看着它,没有不得不考虑它。–大多数问这个问题的初学者都无法做到。

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

甚至无需提及int * i


6

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

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

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


4

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

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);

天哪,C ++总是向我展示一些新东西:)。谢谢!
陶Szelei

1
OMG,C ++令人恐惧!typedef int* int_ptr本来可以做到的。当然,我必须为不同的指针类型声明一个新的typedef,但是实际上有多少个呢?最多八个?
benzado

1
@benzado实际上,您不需要typedef或我演示的任何花哨技巧,因为没有理智的人在一行中声明多个变量。仍然很有趣。
fredoverflow

2
我知道,我在讲的更多是C ++程序使用语言功能的趋势,只是因为它们可以。
benzado

@benzado:!!! 我经常看到这个!
乔治

2

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


C声明语法在这方面是不一致的,因为类型信息很容易出现在标识符之后:数组是最清楚的例子。

@Roger:我知道,但是这个问题是关于单个变量声明的,别无其他。
Allon Guralnek 2010年

我认为这对它有很多了解。:)我理解问题的方式是询问您到处使用哪种样式。

@Roger:您可能是对的,但是我的目的是回答OP的问题:“您最喜欢的声明指针的方法是什么?”。显然,每个人都可以随意考虑问题中提出的问题,在这里甚至鼓励这样做。作为不使用C / C ++进行开发的人,我认为这样做会偏离我的专业领域。
Allon Guralnek 2010年

2

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

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

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


1

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

  • int * 当标识符不存在时,从视觉上强调该名称不存在。
  • int* intptrtypedefs和类似的声明上,以直观地强调它是类型的一部分。与函数指针声明类似:(int* (*foo)(int))
  • int *identifier以及class &identifier在功能参数上直观地增强该参数可能是所谓的“输出”参数。
  • const int * const * const每当我使用cv限定词时。
  • int * foo; 在当地的声明上。

我想我有点视觉导向。


1

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


6
“ C中没有指针类型” -您从哪儿得到的?int*是指针类型。
基思·汤普森

-2

我使用int *i它是因为它更容易看出它是一个指针,尽管我认为这并不重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.