我想理解为什么在同一行上声明更多具有相同数据类型的指针时,为什么必须在每个标识符之前添加一个星号。
Here是我从中读取的地方
这行可能引起您注意的另一件事是:
int * p1,* p2;
这声明了上一个示例中使用的两个指针。但是请注意,每个指针都有一个星号(*),以便两个指针都具有int *类型(指向int的指针)。 由于优先规则,因此这是必需的。请注意,如果代码是:
int * p1,p2;
p1的确为int *类型,但p2的为int类型。对于这个目的,空间根本不重要。但是无论如何,对于大多数想在每个语句中声明多个指针的指针用户而言,只需记住为每个指针放置一个星号就足够了。甚至更好:对每个变量使用不同的语句。
operator precedence
问题:这里使用什么规则,这是什么优先级?它是关于逗号还是星号?我不知道。
最佳答案
没有任何优先级规则。简单声明的语法看起来像
decl-specifier-seq init-declarator-listopt ;
符号*属于声明符,而不属于decl-specidier-seq,例如类型说明符
int
。因此,您可以例如重写声明
int * p1, * p2;
喜欢
int ( * p1 ), ( * p2 );
其中
( *p1 )
和(* p2)是十进制数(在这种情况下,括号是多余的)你可能不写例如
( int * ) p1, p2;
编译器将发出错误。
声明更复杂的类型时,需要括号。例如,让我们声明一个指向数组的指针
int ( *p )[N];
其中N是一些常数。
因此,可以将声明符括在括号中。
让我们考虑一个更复杂的声明:一个函数,该函数返回指向该函数的指针,并具有另一个函数作为参数
void ( *f( int cmp( const void *, const void * ) )( int *a );
至于优先级,那么构建声明符的规则将在语法中对其进行描述
例如
如果你会写
int * a[10];
那么它是
int *
类型的10个元素的数组。但是如果你会写
int ( *a[10] );
然后是由10个指针组成的数组,这些指针指向
int
类型的对象。如果你会写
int ( *a )[10];
那么它是一个指向10个整数的数组的指针。
考虑到typedef也是decl-specifier。
所以例如这个typedef
typedef int *intPtr;
你可以像这样重写
int typedef *intPtr;
甚至喜欢
int typedef ( *intPtr );
声明的另一个例子。让我们考虑一个多维数组。在可以声明像
int ( ( ( a )[N1] )[N2] );
虽然括号再次是多余的。但是,它们可以帮助您理解数组如何隐式转换为指向表达式中第一个元素的指针。
例如,如果您有一个数组
int a[N1][N2];
然后要获得指向其第一个元素的指针声明,可以重写该声明,例如
int ( a[N1] )[N2];
现在用
a[N1]
代替*a
(例如* p)。int ( *p )[N2] = a;
关于c++ - 在一条指令中声明更多指针的运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365034/