二维指针、二维数组
char **p;
这是一个指向指针的指针,即二维指针
内存中的存放形式
char**认为内存中是连续的指针,p++每次都取下一个指针的地址
指向指针的指针(二维指针) 和 指针数组 是同样的类型,如下:
char *p[10];
char **p2 = p; //同样的类型
例子0:二维指针 等价于 指针数组
{
char test[10][10] = { {"一天"}, {"一夜"} };
char* testp [10]; //指针数组
for (int i = 0; i < 10; i++)
{
testp[i] = test[i];
}
char** temp = testp; //二维指针 等价于 指针数组
}
例子1: 利用二维指针 动态创建 二维数组
void test2(int** array, int n, int m)
{
for(int i=0;i<n;i++)
{
for(int j=0; j<m; j++)
{
//动态二维数组可以利用二维指针直接访问
array[i][j] = i*10+j;
}
}
}
int main()
{
int rows = 3;
int cols = 3;
int** numbers = new int *[rows]; //动态创建一个指针数组 给 二维指针
for(int i=0; i<rows; i++)
{
//numbers[i]代表指针数组的第i个元素,是一个指针,
//该指针指向一个长度为cols的int型数组
numbers[i] = new int[cols];
}
test2(numbers, rows, cols);
for(int i=0; i<rows; i++)
{
for(int j=0; j<cols; j++)
{
printf("%d ", numbers[i][j]);
}
printf("\r\n");
}
}
例子2:利用二维指针 动态创建 二维数组
void test2(int** array, int n, int m)
{
for(int i=0;i<n;i++)
{
for(int j=0; j<m; j++)
{
//动态二维数组可以利用二维指针直接访问
array[i][j] = i*10+j;
}
}
}
int main()
{
int row = 3;
int col = 3;
//动态创建一个指针数组 给 二维指针
int **temp= (int **)malloc(row* sizeof(int*));
for (int i = 0; i < row; i++)
{
//temp[i]代表指针数组的第i个元素,是一个指针,
//该指针指向一个长度为col的int型数组
temp[i] = (int *)malloc(col* sizeof(int));
memset(temp[i], 0, col* sizeof(int));
}
test2(temp, row, col);
for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
{
printf("%d ", temp[i][j]);
}
printf("\r\n");
}
}
例子3: 利用二维指针访问 静态二维数组,必须知道第二维的尺寸
void test1(char **p, int n, int m)
{
char (*p2)[m] = (char(*)[m])p; //必须知道第二维的尺寸
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
p2[i][j] = i+j;
}
}
}
int main()
{
char a[10][10] = {0};
test1((char **)a, 10, 10);
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
printf("%d ", a[i][j]);
}
printf("\r\n");
}
}
例子4:二维数组复习
int arr[2][2] = {{1, 2}, {3, 4}};
int *p1 = arr[0]; //p1是第0行第0列的地址
int **p2 = &p1;
int (*p3)[2] = arr; //p3是第0行的地址
//p2等价于&p1 *p2等价于p1 **p2等价于 *(p1+0)即等价于arr[0][0]
printf("I am p2:%d\n", **p2);
//**p3 代表 arr[0][0]
printf("I am p3:%d\n", **p3);
//p2等价于&p1,仅代表p1指针自身的地址
//*p2代表了p1, 是第0行第0列的地址
//p3代表了第0行的地址, *p3代表第0行第0列的地址
//二维数组 第0行的地址 和 第0行第0列的地址 相等
printf("p2:%p, * of p2:%p\n", p2, *p2);
printf("p3:%p, * of p3:%p\n", p3, *p3);