优先级的结合
1.主要前四级:
级数 | 运算符 | 同级结合方向 |
---|---|---|
1 | [] () . -> | → |
2 | ++ - - * & !~ (type) sizeof | ← |
3 | / * % | → |
4 | + - | → |
注:(type)为强制类型转换
2. 例子
-
int *p[4]
解释:4个int类型指针 ,[ ] 运算级高于 *
-
int *(*p)
解释:指向指针变量的指针,虽然()优先级高, 但 2层的运算←方向,所以 int **p=int *(*p)等价;
扩展:利用指针去访问另一个变量 为"间接访问"
单级间址: int *p=&a
二级间址: int **p=&a
理论可以延申到更多级,级数越多,可读性越差。 -
a[i].num
解释:[]与.同级,方向→,a[i]的name -
(*a)->num与 *a->num
解释:前者()优先级,而后者一般会报错前者()优先级,而后者一般会报错 -
a->num/ a->num++ /++a->num
解释:-> 运算级比++ 高
a->num: 得到a指向的变量的成员num
a->num++:得到a指向的变量的成员num,用完后该值+1
++a->num:得到a指向变量的成员num,并使之+1,然后使用 -
*((int *) *(int *)(a) +1)
用了虚函数表的例子
#include <iostream>
using namespace std;
class A { virtual void a() { cout << "virtual a" << endl; } };
class B :public A { void a() { cout << "a"<<endl; } virtual void b() { cout << "virtual b" << endl; }
};
int main()
{
B b;
A *a = &b;
cout << a<<endl;
cout << (int*)a << endl;
cout << *(int*)a << endl;
cout << (int *)*(int*)a << endl;
cout << (int *)*(int*)a+1 << endl;
cout << *((int *)*(int*)a) << endl;
cout << *((int *)*(int*)a+1) << endl;
}
*与(type)优先级比+高,且方向←
1)cout<<(int * )a与cout<<a输出结果相同 因为(int * )a得到a的中间变量假设为c,c与a是里面存的东西是一样的,所以输出一样,改变的是产生的中间变量里面的存储的东西是int类型,而a里面存的是 16进制的地址
需要说明的是例如 float x=3.1(int)x 得到的是int类型的中间变量,x的值与类型都不变
2)(int * )a先变成 指向int 类型的指针变量,指针a存的是一开始是地址,地址一般是16进制,然后这样的就是把指针a里面存的是16进制地址变成十进制的,
3)cout<< * (int *)a会输出这个十进制的数
4)(int * ) * (int * )a同理再把这个变成指向int 类型的指针变量,现在又变成了16进制地址 2726732=00299B4C(H)
5)(int * ) * (int * )a 这个地址里指向的内存存的东西
6)(int * ) * (int * )a+1, 指针+1,位移到下一个指针的位置 int指针4个字节,正如00299B4C与00299B50差了四个存储单位
拓展内容:
const位置 | 名字 | 效果 |
---|---|---|
const int p | 常变量 | 变量的值不能变 |
const int *p | p是指向常量的常指针 | 不能通过p改变其指向的内容 |
int const *p | p是常指针 | p的指向不能变 |