优先级

优先级的结合

1.主要前四级:

级数 运算符 同级结合方向
1 [] () . ->
2 ++ - - * & !~ (type) sizeof
3 / * %
4 + -

注:(type)为强制类型转换

2. 例子

  1. int *p[4]

    解释:4个int类型指针 ,[ ] 运算级高于 *

  2. int *(*p)

    解释:指向指针变量的指针,虽然()优先级高, 但 2层的运算←方向,所以 int **p=int *(*p)等价;

    扩展:利用指针去访问另一个变量 为"间接访问"
    单级间址: int *p=&a
    二级间址: int **p=&a
    理论可以延申到更多级,级数越多,可读性越差。

  3. a[i].num
    解释:[]与.同级,方向→,a[i]的name

  4. (*a)->num与 *a->num
    解释:前者()优先级,而后者一般会报错前者()优先级,而后者一般会报错

  5. a->num/ a->num++ /++a->num
    解释:-> 运算级比++ 高
    a->num: 得到a指向的变量的成员num
    a->num++:得到a指向的变量的成员num,用完后该值+1
    ++a->num:得到a指向变量的成员num,并使之+1,然后使用

  6. *((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的指向不能变

猜你喜欢

转载自blog.csdn.net/qq_42146775/article/details/84498729