可能重复:
In C, why is the asterisk before the variable name, rather than after the type?
What's your preferred pointer declaration style, and why?
在C ++中,我看到指针以不同的方式放置。例如,
char* ptr
char * ptr
char *ptr
以上3个例子是否相同? (与&相同)
答案 0 :(得分:5)
没关系。 (例如,它们是相同的。)你甚至可以在没有任何空格的情况下写char*ptr;
请注意,在一行上有多个声明:char* ptr, noptr;
。在这里,第三种语法更加清晰:char *ptr, noptr;
我的规则是避免这种混淆:每行只有一个变量。另一种方法是在没有错过指针的*
:typedef
的情况下做到这一点,例如:
typedef char* CharPtr;
CharPtr ptr1, ptr2; // now both are pointer
虽然那时你需要注意其他事情,比如const
ness,所以我坚持上面提到的规则:
typedef char* CharPtr;
const CharPtr p1; // const char* ?? or char* const ??
CharPtr const p2; // char* const ?? or const char* ??
// Eg.: Can't the pointer or the pointee be changed?
(以上所有内容也适用于参考文献&
。)
答案 1 :(得分:4)
C人倾向于选择char *p
,而C ++人倾向于选择char* p
(至少Bjarne会这样做)。编译器不关心空格,你也可以说char * p
或char*p
。
很多人说char* p
很危险,因为char* p, q
可能会让人感到困惑。原则上这是正确的,但是:
为了提高可读性,无论如何都不应在一个声明中声明多个名称。
更重要的是,在C ++中,你应该更喜欢RAII类型而不是原始指针。
答案 2 :(得分:3)
C ++人强调类型,C人强调用法。
所以你在C ++中看到char* x
,是因为“x
的类型是指向char的指针”。 C ++有一个强大的类型系统,语言在其上。这是不 C中的情况。
在C中,您根据要对它们执行的操作声明变量。当你在C中看到char *x
时,思考过程是“当你取消引用x时,你得到一个字符”。另一个例子:
char (*f)(int);
读取“当你取消引用f
并用int调用它时,你得到一个字符”,即。 f
是一个指向函数的指针,该函数接受int并返回char。
答案 3 :(得分:2)
没关系。但是,C ++人倾向于char* ptr
,而C人更喜欢char *ptr
。这完全取决于个人偏好。
但请注意,char* ptr, noptr
将ptr
声明为指针,将noptr
声明为char值。
答案 4 :(得分:2)
他们都工作。 char *ptr
经常被提倡,因为它使得在这种情况下发生的事情变得更加清晰:
char *ptr, var;
这声明了一个char指针和一个char。
答案 5 :(得分:0)
声明中*
和&
修饰符周围的潜在空格对编译的代码没有影响。
答案 6 :(得分:0)
C ++是一种自由格式语言。所以,在这种情况下,空间并不真正算在内,所有意思都是一样的。