二维指针
什么是二维指针?
一维指针存放变量的地址,二维指针存放一维指针的地址。
int first()
{
int n = 6, m = 0;
printf("&n=%p\n", &n);
printf("&m=%p\n", &m);
int *p = &n;
int **pp = &p;
printf("n=%d\nn=%d\n", *p, **pp);
}
//一维指针存放变量的地址,二维指针存放一维指针的地址
二维指针与数组的关系
int second()
{
// 指针与数组之间关系
int arr[6] = {1, 2, 3, 4, 5, 6};
int *p = arr;
for (int i = 0; i < 6; ++i)
{
printf("%d\n", p[i]);
}
// 二维指针与指针数组之间关系
int arr2[6] = {7, 8, 9, 10, 11, 12};
int *parr[] = {arr, arr2};
int **pp = parr;
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 6; ++j)
{
printf("%d ", pp[i][j]);
}
printf("\n");
}
printf("--------------\n");
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 6; ++j)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
}
二维指针怎么用
二维指针作为函数参数
//二维指针作为函数参数
void Fun_b(int **pp)
{
int *p = malloc(sizeof(int));
*p = 100;
*pp = p;
printf("&p=%p\np=%p\n*p=%d\n", &p, p, *p);
}
int Fun_a()
{
int *p = NULL;
Fun_b(&p);
printf("------%p-----\n", &p);
printf("&p=%p\np=%p\n*p=%d\n", &p, p, *p);
free(p);
p = NULL;
}
二维指针作为函数返回值
创建一个矩阵r*c
int **CreateIdentityMatrix(int r, int c)
{
int **pm = (int **)malloc(sizeof(int *) * r);
for (int i = 0; i < r; ++i)
{
pm[i] = (int *)malloc(sizeof(int) * c);
for (int j = 0; j < c; ++j)
{
pm[i][j] = (i == j);
}
}
return pm;
}
void PrintMatrix(int **pm, int r, int c)
{
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
printf("%d ", pm[i][j]);
}
printf("\n");
}
}
int main1()
{
int r, c;
scanf("%d%d", &r, &c);
int **pm = CreateIdentityMatrix(r, c);
PrintMatrix(pm, r, c);
}
指针数组和二维数组指针
针数组和二维数组指针在定义时非常相似,只是括号的位置不同的区别
int *(p1[5]); //指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[5]; //二维数组指针,不能去掉括号
指针数组和二维数组指针有着本质上的区别:
指针数组是一个数组,只是每个元素保存的都是指针。
二维数组指针是一个指针,它指向一个二维数组。