提问人:jakogut 提问时间:4/18/2010 最后编辑:Communityjakogut 更新时间:4/27/2022 访问量:95795
声明指针;类型和名称之间空格的左侧或右侧的星号?[复制]
Declaring pointers; asterisk on the left or right of the space between the type and name? [duplicate]
问:
可能的重复项:
什么更有意义 - char* string 或 char *string? C++ 中的指针声明:星号的位置
我在很多代码中都看到了这个的混合版本。(顺便说一下,这适用于 C 和 C++。人们似乎以两种方式之一声明指针,我不知道哪一种是正确的,也不知道它是否重要。
第一种方法是将星号放在类型名称旁边,如下所示:
someType* somePtr;
第二种方法是将星号放在变量名称旁边,如下所示:
someType *somePtr;
一段时间以来,这一直让我发疯。是否有任何标准方法来声明指针?如何声明指针重要吗?我以前使用过这两种声明,我知道编译器不在乎它是哪种方式。但是,我看到以两种不同方式声明的指针这一事实使我相信这背后是有原因的。我很好奇这两种方法是否在某种程度上更具可读性或逻辑性,这是我所缺少的。
答:
没关系,这是个人喜好。
有些人喜欢将类型放在一起:
int* p;
其他人说它应该放在变量旁边,因为以下原因:
int *p, x;//declare 1 int pointer and 1 int
int *p, *x;//declare 2 int pointers.
随着时间的流逝,您将忽略这一点并接受这两种变化。
评论
int *p
int* p
我见过的每一种方式都是
TheType *myPointer
因为您正在声明 TheType 类型的 POINTER。类似声明
TheType myVar
将声明 TheType 类型的实例变量。
此外,您可以清楚地执行此操作并使其易于阅读
TheType myVar, *myPointer;
评论
这是一个偏好问题,有点像圣战,就像大括号一样。
“C++”风格
someType* somePtr;
强调指针变量的类型。从本质上讲,它是在说“的类型是指向的”。somePtr
someType
“C”型
someType *somePtr;
强调指向数据的类型。从本质上讲,它是在说“所指向的数据类型是”。somePtr
someType
它们的意思是一样的,但这取决于给定程序员在创建指针时的心智模型是“聚焦”的,可以说是指向的数据还是指针变量。
把它放在中间(如)是试图避免承诺任何一个。someType * somePtr
评论
*
intconst
int const
const
int const * const p;
int const* const q;
int const*const r;
typedef Cat *CatPointer;
typedef Cat* CatPointer;
using CatPointer = Cat*;
using *CatPointer = Cat;
someType*
someType* value1, value2;
value1
value2
value1
someType*
the type of data pointed to by somePtr is someType
-> 那你会怎么读?注意 是 的修饰符,而不是变量。你不能说“常量变量 somePtr 指向的数据类型是 someType”。你的模棱两可就在那里。“somePtr 的类型是指向 someType 的常量指针”是唯一一致的。说“变量 somePtr 不断指向的数据类型是 someType”也已经有点偏离了。它不再是关于将参数声明为常量。someType * const somePtr
const
*
这不重要。现在有人会过来把问题当作一个骗子来结束,其他人会展示如果你在相同的声明中声明多个变量,同时更好地反映代码的语法结构,那么方式是如何中断的,另一个人会展示 Stroustrup 更喜欢这种方式,并将类型放在左侧。int* a
int *a
int* a
很多意见,但这里没有“正确”的方式。
评论
rt (*f) ()
t *a, *b
const
type * var
type const*const v;
type const* const v;
type const *const v;
type const * const v;
const
*
int *p;
* p
int *p
int* p, q;
int *p, q;
int* p;
int *a
int* a
int* restrict a
int restrict *a
我认为将星号放在变量名称旁边更清晰。
您可能会错误地声明认为它们都是指针,但只有变量是指针; 只是一个.声明为 可避免此问题。someType* one, two;
one
two
someType
someType *one, *two
评论
two->doSomething()
int
之所以出现这种差异,是因为C++在C之上添加了一个更强大的类型系统。
C型
C 程序员通常从“价值观”的角度来思考,因此
int *pValue;
读作“pValue 的取消引用是一个 int”。
C++ 样式
而 C++ 程序员在“类型”中思考
int* pValue;
读取“pValue 的类型是指向 int 的指针”。
当然,编译器根本看不出有什么区别。然而,你会发现,在C++编程时,坚持“值语义”的是C程序员。
评论