char *foo与char* foo的区别

6
简单的问题是:为什么你要写代码?
char *foo;

而不是

char* foo;

让我解释一下:对于我来说(来自Java),声明就像是这样的:

<variable-type> <variable-name>;

在上面的例子中,我声明了一个名为foo的变量,类型为char*(因为它是指向char的指针)。但是无论我读什么c/c++/c#代码,都会看到一个名为*foo的变量,类型为char。编译器不关心空格,但作为开发者的我却关心。
总之,我想要一个好的解释,为什么要写char *foo而不是char* foo(后者似乎对我更方便)。

请具体说明你所询问的编程语言是什么。C#通常不使用指针,所以我不确定为什么你要包含它。 - Oded
4
你遗漏了最常见的形式 char * foo - Lindydancer
请参阅Stroustrup的常见问题解答 - Jesse Good
dtb已经将C#编辑掉了,主要是为了表明我遇到的问题不是(真正的)与语言相关。 (C#确实允许使用指针,但通常不会使用,你是对的) - Dominik Schreiber
4个回答

14

考虑以下声明:

char *p, c;

这声明了一个名为p的指向字符的指针和一个名为c的字符变量。这表明变量声明并不完全是你所描述的简单和清晰的格式。


那么对于懒惰的情况,在同一行中声明两个变量,您会在任何地方都使用它(即使这似乎不是最好的方式 - 对我来说 - 这样做)? - Dominik Schreiber
1
不,这是因为语言的工作方式如此。该语言并不将 * 视为类型的逻辑部分,而更多地视为一种类型修饰符,它绑定到特定声明的变量,而不是声明本身。在答案中的那行代码中,只有 p 被“修改”为指针。这就是语言的工作方式。 - David Schwartz
@DavidSchwartz 更准确地说,* 是声明符 (8.0.0) 的一部分,并将基本类型扩展为复合类型。 - cooky451

5

需要明确的是,在C和C++中,两种写法都是完全合法的,并且没有一个被广泛认可的“最佳方法”。

char *foo的原因是如下代码:

char* foo, bar;

这段代码并没有像你在读代码时想象的那样声明了两个char指针。

它声明了一个char指针(foo)和一个char变量(bar)。

如果你想要声明两个char指针,需要使用以下代码:

char* foo, * bar;

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

const *foo, *bar;

这是唯一可以清楚表明*确实是特定变量的限定符,而不是绑定类型的方法。
但很多人,包括我在内,更喜欢与你一样写char* foo。 然后我只需要避免在单个语句中声明两个变量即可。 总体来说,这并不难。;)

2

我总是选择使用char* var的方式,正是因为你所说的理由。我想这只是一个习惯问题。


1
变量声明分为三个部分:基本类型、声明符和名称。如果用逗号分隔,你会得到以下内容:
char *a, b, c[5], *d[5];

a的类型是“指向字符的指针”,b的类型是“字符”,c的类型是“5个字符的数组”,d的类型是“5个指向字符的指针的数组”。这就是为什么在C和C++中,将星号写在名称后面更合乎逻辑,因为它不属于基本类型。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接