C/C + + 中指针变量声明的正确方法

我注意到有些人使用下面的符号来声明指针变量。

(a) char* p;

而不是

(b) char *p;

我使用(b)。符号(a)背后的理性是什么? 表示法(b)对我来说更有意义,因为字符指针本身不是一种类型。相反,类型是字符,变量可以是指向该字符的指针。

char* c;

这看起来像是有一个 char * 类型,而变量 c 就是这个类型。但实际上类型是 char,* c (c 指向的内存位置)就是这种类型(char)。如果同时声明多个变量,这种区别就变得明显了。

char* c, *d;

这看起来很奇怪。C 和 d 都是指向字符的相同类型的指针。在这里,因为下一个看起来更自然。

char *c, *d;
73115 次浏览

I personally prefer to place the * with the rest of the type

char* p;  // p is a pointer to a char.

People will argue "but then char* p, q; becomes misleading", to which I say, "so don't do that".

It's all a matter of preference, personally on projects that I see the char* I tend to declare multiple pointers on separate lines. There's no real "correct" way to do this and it all comes down to preference. Some say it's easier to read (a) while others say that (b) is easier to declare more variables of the same type on the same line.

I find (b) to be more common, and in some cases I have seen

char * a;

or something like this. Again preference. Whatever you're comfortable with or whatever the project I'm working on uses I will use (unless I write it myself in which case I use (a))

Bjarne Stroustrup said:

The choice between "int* p;" and "int *p;" is not about right and wrong, but about style and emphasis. C emphasized expressions; declarations were often considered little more than a necessary evil. C++, on the other hand, has a heavy emphasis on types.

A "typical C programmer" writes "int *p;" and explains it "*p is what is the int" emphasizing syntax, and may point to the C (and C++) declaration grammar to argue for the correctness of the style. Indeed, the * binds to the name p in the grammar.

A "typical C++ programmer" writes "int* p;" and explains it "p is a pointer to an int" emphasizing type. Indeed the type of p is int*. I clearly prefer that emphasis and see it as important for using the more advanced parts of C++ well.

Source: http://www.stroustrup.com/bs_faq2.html#whitespace

I'd recommend the latter style because in the situation where you are declaring multiple pointers in a single line (your 4th example), having the asterisk with the variable will be what you're used to.

The compromise is

char * p;

K&R uses

char *p;

It's up to you unless you're following a coding standard -- in that case, you should follow what everyone else does.

There are no difference how to write. But if you want to declare two or more pointers in one line better to use (b) variant, because it is clear what you want. Look below:

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
// Maybe here it is mistake, maybe not.
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.