我目前正在读一本关于 C 的书。目前我读到的是关于指针的。
基本上,我认为我已经理解了这个概念。无论如何,有一件事让我感到困惑:
有时作者使用
void *foo;
创建一个新指针,但有时它是
void* foo;
有区别吗?有关系吗?不是吗?什么时候用什么?...?
我目前正在读一本关于 C 的书。目前我读到的是关于指针的。
基本上,我认为我已经理解了这个概念。无论如何,有一件事让我感到困惑:
有时作者使用
void *foo;
创建一个新指针,但有时它是
void* foo;
有区别吗?有关系吗?不是吗?什么时候用什么?...?
它们是等价的,但在一行中声明多个非 void 类型的变量时,前者可能更可取
int *foo, *bar;
清楚地声明了两个指针,而
int* foo, bar;
声明一个指针和一个int
您可以根据需要在 * 的两侧设置任意数量的空格。无论哪种方式,它都意味着完全相同的东西:
void*foo;
void *foo;
void* foo;
void * foo;
void * foo;
void * foo;
void * foo;
一切都是一样的。如果您从事一个项目,通常会有一些“编码风格标准”来解释该项目中的首选。但是编译器不会根据是否/在哪里有空格来做任何不同的事情。
两者是等价的,没有任何区别。
int *foo, i;
但是你应该知道上面声明的区别。这里只有foo
指针类型,而i
类型int
(不是int*
)。
这两种语法是等价的。唯一的区别是风格问题。
正如您可能已经知道的那样,编译器没有区别。
至于风格问题,有些人认为这样void* ptr
更好,因为类型名称作为一个整体是孤立的。问题是,这不是语言的工作方式:
int* ptr, otherptr; /* otherptr is not a pointer here */
即使您决定不一次声明多个变量,使用隔离类型名称的整个想法也会破坏数组和函数指针。这就是为什么我更喜欢另一种风格:
int *ptr, *otherptr, dontDeclareTooManyThings[N];
有区别吗?
当然有。(如果没有,您就不会问这个问题。)在第一种情况下,星号位于空白的一侧,而在另一种情况下位于另一侧。
有关系吗?
确实如此。然而,不是在程序逻辑方面 - 两者的解析方式完全相同。但是,这是个人喜好问题。我一般推荐第二种方式,即void *ptr
,因为指针限定符(星号)修改变量,而不是类型。
什么时候用什么?
刚刚解释了。
两种变体均有效。它们代表不同的风格。
考虑
char* foo, bar;
char *foo, bar;
在这两种情况下 foo 是一个指针, bar 不是。
还要考虑(可读性)
char* foo() {
// return something
}