++与解引用运算符
在C语言中,解引用操作符*和自增++操作符的优先级如下:
- 解引用操作符:优先级最高
- ++ 自增操作符++:优先级较低
所以,在同一个表达式中,*会先于++进行运算。
例如:
- *p++ // 先解引用p,然后p自增,返回*p.
- *(p++) //先解引用p,然后p自增,返回*p.
- (*p)++ // 先解引用p,然后解引用值自增,返回*p.
- ++*p // 先解引用*p,然后*p自增,返回自增后的值.
- ++(*p)// 先解引用*p,然后*p自增,返回自增后的值.
多维数组指针
同类型的指针可以相减
二维数组
int arr[2][7] = { 0 };
auto p = arr; //p为一维指针
int(*bias)[7] = p;
cout << p++ << "\r\n"; //arr[0]
cout << p++ << "\r\n"; //arr[1]
cout << p++ << "\r\n";//arr[2]
cout << p[0] << "\r\n";// arr[3]
cout << p[0][0] << "\r\n";
cout << (bias==arr?true:false) << "\r\n";
解析 :arr为一维数组指针.arr++则地址自增sizof(int)*7.7为列数.
p=arr->p[0]第0行.以此类推.
int arr[2][7][4] = {0};
auto p = arr;
int(*bias)[7][4] = p; //三维指针的数据类型
cout <<"地址相差"<< (int)(p - arr) << "\r\n"; // 1
cout << "-------------------------------" << endl;
//打印其类型
cout << typeid(p).name() << "\r\n"; //指向三维数组
cout << typeid(p[0]).name() << "\r\n"; //指向二维数组
cout << typeid(p[0][0]).name() << "\r\n"; //指向一维数组
cout << (bias==arr?true:false) << "\r\n";
auto p2 = p[0]; //三维降到二维
cout << p2++ << endl;
cout << p2 << endl; //相差16个字节 也就是[4]
cout << "--------------------------------" << endl;
auto p3 = p[0][0]; //三维降到一维
cout << p3++ << endl;
cout << p3 << endl; //相差4个字节
> 解析 : p为三维数组指针. p++地址自增7*4*sizeof(int).7,4为后二维.p[0]为二维数组指针,执行++地址自增4*sizeof(int).p[0][0]为一维数组指针,执行++地址自增sizeof(int).
规律: n维数组指针自加,地址相差后n-1维相乘再乘以sizeof(类型).
打印结果