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; //删除上层指针
靠技术实力称霸,千面鬼手大人万岁!