0

可能重复:
在 C 中,声明指针的正确语法是什么?
用 C/C++ 编写“指向某物的指针”的好方法

我目前正在读一本关于 C 的书。目前我读到的是关于指针的。

基本上,我认为我已经理解了这个概念。无论如何,有一件事让我感到困惑:

有时作者使用

void *foo;

创建一个新指针,但有时它是

void* foo;

有区别吗?有关系吗?不是吗?什么时候用什么?...?

4

7 回答 7

3

它们是等价的,但在一行中声明多个非 void 类型的变量时,前者可能更可取

int *foo, *bar;

清楚地声明了两个指针,而

int* foo, bar;

声明一个指针和一个int

于 2013-01-26T11:55:03.097 回答
3

您可以根据需要在 * 的两侧设置任意数量的空格。无论哪种方式,它都意味着完全相同的东西:

void*foo;
void *foo;
void* foo;
void * foo;
void                     * foo;
void *                     foo;
void           *           foo;

一切都是一样的。如果您从事一个项目,通常会有一些“编码风格标准”来解释该项目中的首选。但是编译器不会根据是否/在哪里有空格来做任何不同的事情。

于 2013-01-26T11:56:41.343 回答
2

两者是等价的,没有任何区别。

int *foo, i;

但是你应该知道上面声明的区别。这里只有foo指针类型,而i类型int(不是int*)。

于 2013-01-26T11:53:59.867 回答
1

这两种语法是等价的。唯一的区别是风格问题。

于 2013-01-26T11:52:57.880 回答
1

正如您可能已经知道的那样,编译器没有区别。

至于风格问题,有些人认为这样void* ptr更好,因为类型名称作为一个整体是孤立的。问题是,这不是语言的工作方式:

int*  ptr, otherptr; /* otherptr is not a pointer here */

即使您决定不一次声明多个变量,使用隔离类型名称的整个想法也会破坏数组和函数指针。这就是为什么我更喜欢另一种风格:

int *ptr, *otherptr, dontDeclareTooManyThings[N];
于 2013-01-26T11:55:24.933 回答
1

有区别吗?

当然有。(如果没有,您就不会问这个问题。)在第一种情况下,星号位于空白的一侧,而在另一种情况下位于另一侧。

有关系吗?

确实如此。然而,不是在程序逻辑方面 - 两者的解析方式完全相同。但是,这是个人喜好问题。我一般推荐第二种方式,void *ptr,因为指针限定符(星号)修改变量,而不是类型。

什么时候用什么?

刚刚解释了。

于 2013-01-26T11:56:33.130 回答
0

两种变体均有效。它们代表不同的风格。

考虑

char* foo, bar;
char *foo, bar;

在这两种情况下 foo 是一个指针, bar 不是。

还要考虑(可读性)

char* foo() {
    // return something
}
于 2013-01-26T11:56:24.417 回答