凌彦慧 发表于 2025-6-4 19:43:35

C++中指针和数组相关的运算符优先级

概述

本文深入介绍了与指针和数组相关的运算符优先级,利用代码示例展示了当左结合和右结合运算符同时存在时的结合方式,同时也演示了如何使用()来强制人为指定结合顺序。
指针、数组相关的运算符优先级

下表展示了相关运算符的优先级,有4个级别,同级别内的运算符按照结合性依次调用。这4类也是所有运算符中优先级最高的4档,其它的运算符优先级都比它们低:
优先级运算符描述结合性1::作用域解析左结合2()
[]
.
->强制运算结合,函数形参列表
数组元素下标访问
类的成员访问
类指针的成员访问右结合3(int)
*
&强制转换
指针解引用
变量取地址左结合4.*
->*类的成员函数指针
类指针的成员函数指针左结合容易产生困惑的、需要仔细进行优先级判断的往往是一个左结合加一个右结合,例如:

[*]*ptr[]
[*](int)a()
[*]&obj->data
[*]obj->*fun()
请记住一个重要方法:当我们需要改变运算符的结合顺序(C++默认的优先级不是我们的意愿)时,可以通过添加()来人为强制指定优先顺序,因为()是除了::以外具有最高优先级的一类运算符。
简单例子:以[]和*为例探讨运算符结合规律

下面的p1, p2是数组,p3是指针:
int *p1;    // p1是一个数组,元素个数为2,每个元素为(int*)
int *(p2);// 等价于*p2,p2是一个数组
int (*p3);// p3是一个指针,指向一个int数组,这个int数组的元素个数必须是2!因此只要记住两点即可:

[*][]的优先级高于*:即*p1和*(p1)等价。
[*]这个优先级同时适用于定义语句(*为指针定义符)和执行语句(*为解引用符)中:
int *p1;    // 定义语句:先看[]:p1是一个数组,元素个数为2,每个元素为(int*)。等价于*(p1)int (*p2);// 定义语句:先看*: p2是一个指针,指向一个int数组,这个int数组的元素个数必须是2!cout
页: [1]
查看完整版本: C++中指针和数组相关的运算符优先级