c++——数组——指针 二级指针 数组初始化 数组打印 动态二维数组

    int a = 10;
    int *p = &a;
    int **pp = &p;
    printf("%d\t%d\n", *p, **pp);  // 10   10    
//数组初始化:
    int a[4];//里面为未知值
    int a[4] = { 0 }; //初始化为0
//二维数组指针
    int arr1[3][4] = { 0 };
    int(*pArr)[4] = NULL;
    pArr = arr1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; i < 4;j++)
        {
            //下面三中表示模式完全相同
            *(*(pArr + i) + j) = i * 4 + j;
            pArr[i][j] = i * 4 + j;
            arr1[i][j] = i * 4 + j;
        }
        
    }
//一级指针
    int *p = (int *)malloc(12 * sizeof(int));
    int index = 0;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            *(p + index++) = i * 4 + j;
        }
    }
    //对应的输出为
    printf("%d\t", *(p + i * 4 + j));
    //二级指针
    int **pArr4 = NULL;
    *pArr4 = (int *)malloc(4 * sizeof(int *));
    for (int i = 0; i < 4; i++)
    {
        *(pArr4 + i) = (int *)malloc(4 * sizeof(int));
    }
//&三种用法
    //1、取地址运算符,需要一个操作数
    //2、位与运算符,需要两个操作数
    //3、引用,左边需要类型
    int *pArr1[4];//一个数组,里面存放全是int *指针
    for (int i = 0; i < 4; ++i)
    {
        pArr1[i] = (int *)malloc(4 * sizeof(int));
    }
    //一维数组的打印
    int* GetArr(int arr[])
    {
        return arr;
    }

    int arr1[4] = { 1, 2, 3, 4 };
    int *p = GetArr(arr1);
    for (int i = 0; i < 4;++i)
    {
        printf("%d\n", *(p + i));
    }
//二维数组在内存中的储存也是按照一维数组的方式存储的
    //打印二维数组
    int * GetArr_double(int arr[][4])
    {
        return &arr[0][0];
    }

    int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    int *p = GetArr_double(arr);
    for (int i = 0; i < 12;++i)
    {
        printf("%d\n", *(p + i));
    }
//typedef类型重定义
    //需要返回二维数组,但是不降维
    typedef int(*pArr)[4]; //为一个二维数组指针,可以指向所有列为四的数据
    pArr GetArr_d(int arr[][4])   //二维数组不进行降维处理,直接进行重定义
    {
        return arr;
    }
    int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    pArr pa = GetArr_d(arr);
    for (int i = 0; i < 3;i++)
    {
        for (int j = 0; j < 4; ++j)
        {
            printf("%d\n", pa[i][j]);
        }
    }
//typedef类型重定义   重定义的是类型 数组不是类型
    typedef char NAME[32];

    typedef int(*pArr)[4]; //二维数组  pArr是类型

    typedef bool(*pFun)(int, int);    //函数指针 pFun是类型

    bool isMax(int a, int b)
    {
        return a > b;
    }
    void main()
    {
        NAME n1 = "hello"; //这样定义出来的 n1就是一个数组
        pArr pa = NULL;
        pFun pf = NULL;
        pFun pf1 = isMax;    //pf1是一个函数指针,可以指向一个函数,函数名即为首地址
                    //注意  该函数没有括号!!!
    }
    int row, col;
    scanf("%d%d", &row, &col);
    //动态二维数组
    int **p = new int *[row];
    for (int i = 0; i < row; i++)
        *(p + i) = new int[col];

    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            *(*(p + i) + j) = i*col + j + 1; //随便赋的值
        }
    }

    for (int i = 0; i < row; ++i)
    {
        delete[] * (p + i);//删除底层指针
    }
    delete[] p; //删除上层指针