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; //删除上层指针