在C中,声明指针的正确语法是什么?

Edd*_*Edd 17 c variables syntax types pointers

我模糊地回忆起在回答另一个问题之前看到这个,但是搜索未能得出答案.

我不记得声明作为指针的变量的正确方法是什么.是吗:

Type* instance;
Run Code Online (Sandbox Code Playgroud)

要么:

Type *instance;
Run Code Online (Sandbox Code Playgroud)

虽然我知道两者都会在大多数情况下编译,但我相信有一些例子很重要,可能与在同一行上声明同一类型的多个变量有关,因此一个比另一个更有意义.

Vin*_*abb 24

这只是你喜欢阅读它的问题.

有些人这样说是这样的原因:

Type *instance;
Run Code Online (Sandbox Code Playgroud)

是因为它说只有实例是一个指针.因为如果你有一个变量列表:

int* a, b, c;
Run Code Online (Sandbox Code Playgroud)

只有一个是指针,所以它更容易

int *a, b, c, *d;
Run Code Online (Sandbox Code Playgroud)

其中a和d都是指针.它实际上没有区别,只是可读性.

其他人喜欢在类型旁边使用*,因为(除其他原因外)他们认为它是"指向整数的指针",并认为*属于类型,而不是变量.

我个人经常这样做

Type *instance;
Run Code Online (Sandbox Code Playgroud)

但这取决于您和您的公司/学校代码风格指南.


Pon*_*gge 11

那两个是一样的.但是,如果您执行多个声明,前者可能会陷阱.

int* pi, j;

声明一个int指针(pi)和一个int(j).


Joh*_*ode 7

这是C语法的一个意外,你可以用任何一种方式编写它; 但是,它总是被解析为

Type (*pointer);
Run Code Online (Sandbox Code Playgroud)

也就是说,*它总是绑定到声明符,而不是类型说明符.如果你写的

Type* pointer1, pointer2;
Run Code Online (Sandbox Code Playgroud)

它会被解析为

Type (*pointer1), pointer2;
Run Code Online (Sandbox Code Playgroud)

所以只有pointer1会被声明为指针类型.

C遵循"声明模仿使用"范式; 声明的结构应尽可能模仿代码中使用的等效表达式.例如,如果你有一个指向int的指针数组arr,并且你想要检索数组中第i个元素指向的整数值,你将下标数组并取消引用结果,该结果被写为*arr[i](已解析) as *(arr[i])).的类型的表达 *arr[i]int,这样的声明arr被写为

int *arr[N];
Run Code Online (Sandbox Code Playgroud)

哪条路对不对?取决于你问谁.老C放弃了我喜欢,T *p因为它反映了语法中实际发生的事情.许多C++程序员都喜欢T* pp,因为它强调了它的类型,在许多情况下感觉更自然(编写了我自己的容器类型,我可以看到重点,虽然它对我来说仍然感觉不对).

如果要声明多个指针,可以显式声明它们,例如:

T *p1, *p2, *p3;
Run Code Online (Sandbox Code Playgroud)

或者你可以创建一个typedef:

typedef T *tptr;
tptr p1, p2, p3;
Run Code Online (Sandbox Code Playgroud)

虽然我个人不推荐它; 如果你不小心,隐藏在typedef后面的东西的指针可能会咬你.