#include <bits/stdc++.h>
using namespace std;
int main() {
int a[3] = {1, 2, 3};
int b[2][3] = {1, 2, 3, 4, 5, 6};
cout << a[2] << " " << *(a + 2) << endl;//a[2] = *(a+2),a代表了指向a[0]地址的一个指针,解引用(a+2)相当于把a[0]的地址向后移动了两个单位长度
//也就值sizeof(int)的值,就指向了a[2]的地址,单位长度是多少是根据定义的指针类型决定的
int *point_a = a;
cout << point_a + 2 << " " << &a[2] << endl; //point_a = &a[2],point_a+2代表了a[2]的地址
//point_a可以自增,是指针运算,而a不行
//对于b
cout << b << " " << &b[0] << endl; //b是一个指向一维数组的指针,指向了b[0]的地址,等于直接对b[0]取地址
cout << *(b + 1) << " " << b[1] << " " << &b[1][0] << endl;//*(b + 1)等于把b这个指针移动了一个单位长度,这个单位长度是指向二维数组的长度
//也就是说,从b[0]的层面上到了b[1],将跳跃3个int长度,因为每个二维数组
//中含了三个一维数组,移动了一个单位长度后解引用,就找到了b[1],因为
//b本身就是一个指向一维数组的指针,解引用后就变成指向了整型变量的指针
//即,b[1]是一个指向整型变量的指针,指向了b[1][0]的地址
//事实上,b[1]的地址和b[1][0]的地址是相同的
//我们就可以直接把*b看作b[0],*(b+1)=b[1]
cout << *(b + 1) + 2 << " " <<b[1] +2 << " " << &b[1][2] << endl;//*(b + 1) + 2 = b[1]+2,上面提到,b[1]是一个指向b[1][0]
//的地址的整形指针,每次自增也仅仅增加一个int的长度,也就是
//指向了b[1][2]的地址
cout << *(*b + 2) << " " << *(b[0]+2) << " " << b[0][2] << endl; //再次解引用就得到了真正的元素
}
a[2] = *(a+2),a代表了指向a[0]地址的一个指针,解引用(a+2)相当于把a[0]的地址向后移动了两个单位长度
也就值sizeof(int)的值,就指向了a[2]的地址,单位长度是多少是根据定义的指针类型决定的
point_a = &a[2],point_a+2代表了a[2]的地址
point_a可以自增,是指针运算,而a不行
对b
b是一个指向一维数组的指针,指向了b[0]的地址,等于直接对b[0]取地址
(b + 1)等于把b这个指针移动了一个单位长度,这个单位长度是指向二维数组的长度,也就是说,从b[0]的层面上到了b[1],将跳跃3个int长度,因为每个二维数组 ,中含了三个一维数组,移动了一个单位长度后解引用,就找到了b[1],因为,b本身就是一个指向一维数组的指针,解引用后就变成指向了整型变量的指针,即,b[1]是一个指向整型变量的指针,指向了b[1][0]的地址。事实上,b[1]的地址和b[1][0]的地址是相同的,我们就可以直接把b看作b[0]。
(b+1)=b[1]//(b + 1) + 2 = b[1]+2,上面提到,b[1]是一个指向b[1][0]的地址的整形指针,每次自增也仅仅增加一个int的长度,也就是指向了b[1][2]的地址
再次解引用就得到了真正的元素