当前位置:  开发笔记 > 编程语言 > 正文

在指针声明中放置星号

如何解决《在指针声明中放置星号》经验,为你挑选了7个好方法。

我最近决定我必须最终学习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相同?



1> Milan Babušk..:

4,5和6是同一个东西,只有test是一个指针.如果你想要两个指针,你应该使用:

int *test, *test2;

或者,甚至更好(使一切都清楚):

int* test;
int* test2;


空格对于C编译器来说是无关紧要的(忽略预处理器).因此,无论星号与周围环境之间有多少空间,它都具有完全相同的含义.
@ Michael Stum这是C++所以你真的认为有合理的解释吗?
阅读K&R(C编程语言).它非常清楚地解释了这一切.
案例4,5和6是"死亡陷阱".这就是为什么许多C/C++风格的gudes建议每个语句只有一个声明的原因之一.
那么案例4实际上是一个死亡陷阱呢?是否有任何规范或进一步阅读解释为什么int*test,test2只使第一个变量成为指针?

2> Ates Goral..:

星号周围的白色空间没有意义.这三个意思都是一样的:

int* test;
int *test;
int * test;

" int *var1, var2"是一种邪恶的语法,只是为了让人迷惑,应该避免.它扩展到:

int *var1;
int var2;


不要忘记`int*test`.

3> Michael Burr..:

使用"顺时针螺旋规则"来帮助解析C/C++声明;

有三个简单的步骤:

    从未知元素开始,以螺旋/顺时针方向移动; 当遇到以下元素时,用相应的英语语句替换它们:

    [X][]:数组X大小...或数组未定义大小...

    (type1, type2):函数传递type1和type2返回...

    *:指向...的指针

    继续以螺旋/顺时针方向执行此操作,直到所有令牌都被覆盖.

    始终先解决括号中的任何内容!

此外,声明应尽可能在单独的陈述中(绝大多数时候都是如此).


它确实如此,但对于一些更复杂的结构似乎是一个很好的解释
遗憾的是,这看起来令人生畏,非常可怕.
"螺旋"没有任何意义,更不用说"顺时针"了.我宁愿将它命名为"左右规则",因为语法不会让你看起来是右下 - 左下 - 顶部,只是右上角.

4> Scott Langha..:

许多编码指南建议您每行只声明一个变量.这可以避免在提出这个问题之前遇到的任何混淆.我与之合作过的大多数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



5> huskerchad..:

正如其他人所提到的,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

就个人而言,我说每行保留一个变量,那么你喜欢哪种风格并不重要.


这是假的,你叫什么叫`int*MyFunc(void)`?`*MyFunc`是一个返回`int`的函数?没有.显然我们应该编写`int*MyFunc(void)`,并说`MyFunc`是一个返回`int*`的函数.所以对我来说很明显,C和C++语法分析规则对于变量声明来说是完全错误的.它们应该包含指针限定作为整个逗号序列的共享类型的一部分.

6> fredoverflow..:
#include 

std::add_pointer::type test, test2;



7> 1800 INFORMA..:

在4,5和6中,test始终是指针而test2不是指针.在C++中,空白(几乎)从不重要.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有