char * foo vs char * foo

时间:2012-03-04 20:58:51

标签: c++ c coding-style

简单的问题是:为什么要写

char *foo;

而不是

char* foo;

让我解释一下:对我来说(来自Java)声明就像是

<variable-type> <variable-name>;

在上面的例子中,我声明了一个名为foo的{​​{1}}类型的变量(因为它是一个指向char的指针)。但无论我在哪里阅读c / c ++ / c#-Code,它看起来都像char*类型*foo的变量。编译器不关心空格,但我作为开发人员。

tl; dr 我要求的是写char代替char *foo的一个很好的解释(正如所解释的那样,对我来说似乎更方便)。

4 个答案:

答案 0 :(得分:12)

请考虑以下声明:

char *p, c;

这声明了一个名为p的char指针和一个名为c的字符变量。这表明将变量声明视为具有您所描述的简单明确的格式并不完全正确。

答案 1 :(得分:3)

为了清楚起见,在C和C ++中,都是完全合法的,并且没有单一的商定“最佳方式”。

编写char *foo的原因是这样的代码:

char* foo, bar;

这不是,正如你所期望的那样随便读取代码,声明两个char指针。 它声明了一个char指针(foo)和一个char(bar)。

如果你想声明两个char指针,你需要这个:

char* foo, * bar;

这看起来很奇怪,所以更一致的版本是这样的:

const *foo, *bar;

这是明确*实际上是该特定变量的限定符的唯一方法,而不是绑定到该类型。

但很多人,包括我自己,更喜欢和你一样,并且总是写char* foo 然后我只需要避免在上面的单个语句中声明两个变量。 总的来说,这并不难。 ;)

答案 2 :(得分:1)

我总是选择char* var方式。正是因为你的理性。 我想这是一个习惯问题。

答案 3 :(得分:1)

变量声明分为三部分:基本类型,声明符和名称。如果你用逗号分隔它,这就是你得到的:

char *a, b, c[5], *d[5];

是一个类型是“指向char的指针”,b是“char”,c是“5个字符的数组”,而是“5个指向char的指针数组”。这就是为什么在C和C ++中将星形写入名称更合乎逻辑的原因,因为它不属于基类型。

但是,它属于类型而且(类型)(名称)对于人们来说更容易理解,这就是为什么你经常看到char *的原因。在我看来,两种方式都非常好,只要你在使用char *时在每一行中只声明一个变量。 (这是许多编码标准所要求的。)