我最近决定我必须最终学习C/C++,有一件事我不太了解指针,或者更确切地说,他们的定义.
这些例子怎么样:
int* test;
int *test;
int * test;
int* test,test2;
int *test,test2;
int * test,test2;
现在,根据我的理解,前三个案例都是相同的:测试不是一个int,而是一个指针.
第二组示例有点棘手.在case 4中,test和test2都是指向int的指针,而在case 5中,只有test是指针,而test2是"real"int.案例6怎么样?案例5相同?
4,5和6是同一个东西,只有test是一个指针.如果你想要两个指针,你应该使用:
int *test, *test2;
或者,甚至更好(使一切都清楚):
int* test; int* test2;
星号周围的白色空间没有意义.这三个意思都是一样的:
int* test; int *test; int * test;
" int *var1, var2
"是一种邪恶的语法,只是为了让人迷惑,应该避免.它扩展到:
int *var1; int var2;
使用"顺时针螺旋规则"来帮助解析C/C++声明;
有三个简单的步骤:
从未知元素开始,以螺旋/顺时针方向移动; 当遇到以下元素时,用相应的英语语句替换它们:
[X]
或[]
:数组X大小...或数组未定义大小...
(type1, type2)
:函数传递type1和type2返回...
*
:指向...的指针继续以螺旋/顺时针方向执行此操作,直到所有令牌都被覆盖.
始终先解决括号中的任何内容!
此外,声明应尽可能在单独的陈述中(绝大多数时候都是如此).
许多编码指南建议您每行只声明一个变量.这可以避免在提出这个问题之前遇到的任何混淆.我与之合作过的大多数C++程序员似乎都坚持这一点.
我知道一点点,但我发现有用的东西是向后阅读声明.
int* test; // test is a pointer to an int
这开始工作得很好,特别是当你开始声明const指针时,知道它是指针是const,还是指针指向的东西是const变得棘手.
int* const test; // test is a const pointer to an int int const * test; // test is a pointer to a const int ... but many people write this as const int * test; // test is a pointer to an int that's const
正如其他人所提到的,4,5和6是相同的.通常,人们使用这些示例来创建*
属于变量而不是类型的参数.虽然这是一个风格问题,但是对于你是否应该这样思考和写作存在一些争论:
int* x; // "x is a pointer to int"
或者这样:
int *x; // "*x is an int"
FWIW我在第一个阵营,但是其他人为第二个阵营提出论证的原因是它(大部分)解决了这个特殊问题:
int* x,y; // "x is a pointer to int, y is an int"
这可能会产生误导; 相反,你会写
int *x,y; // it's a little clearer what is going on here
或者如果你真的想要两个指针,
int *x, *y; // two pointers
就个人而言,我说每行保留一个变量,那么你喜欢哪种风格并不重要.
#includestd::add_pointer ::type test, test2;
在4,5和6中,test
始终是指针而test2
不是指针.在C++中,空白(几乎)从不重要.