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)
但这取决于您和您的公司/学校代码风格指南.
这是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* p它p,因为它强调了它的类型,在许多情况下感觉更自然(编写了我自己的容器类型,我可以看到重点,虽然它对我来说仍然感觉不对).
如果要声明多个指针,可以显式声明它们,例如:
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后面的东西的指针可能会咬你.