利用指针遍历二维数组

#include <iostream>
using namespace std;

int main() {
    // 一、二维数组三种地址类型
    int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    
    // 1.第一种,元素类型的地址,元数是int类型,那么每个元素地址是int*
    int *p = &a[0][0]; //首元素的地址
    // 可以通过偏移器输出二维数组所有元素,也从侧面验证了二维数组也是连续存储的
    for(int i=0;i<9;i++){
//        cout<<*(p+i)<<" "; //对偏移i个元素
        cout<<p[i]<<" "; //地址+偏移量[i],与上面一样
    }
    cout<<endl;
    /*
     输出:
     1 2 3 4 5 6 7 8 9
     */
    
    // 2.第二种,数组的本质a是首元素a[0]的地址 a==&a[0],这是一个一维数组类型的地址 a[0]是一个有3个元素的一维数组
    int (*p2)[3] = a; // *p2==a
//    p2 = &a[0] //与上面等价 *p2==a[0]
    
    // 所以 a == a[0] == *p2 三个等价
    cout<<a<<endl;
    cout<<a[0]<<endl;
    cout<<*p2<<endl;
    
    // 地址+偏移量
    // a[0]
    
    cout<<a[0]<<endl;
    cout<<*p2<<endl;  // *p2==a[0]  *(p2+1) == a[1]  p2[1] == a[1]
    
    cout<<a[0][0]<<endl;
    cout<<(*p2)[0]<<endl;
    cout<<(*(p2+0))[0]<<endl;
    cout<<p2[0][0]<<endl;
    cout<<endl;
    /*
     输出:
     0x7ff7bfeff2b0
     0x7ff7bfeff2b0
     1
     1
     1
     1
     */
    
    // 3.第三种,二维数组类型地址
    int (*p3)[3][3] = &a;
    
    return 0;
}