二级指针,顾名思义,是个二次的指针,也就是指向指针的指针
基本类型如下:
int** p;
我们来看一段代码:
void d_pointer()
{
int a = 10;
int* pa = &a;//pa是一个指针变量,变量有地址,所以有&pa
int** ppa = &pa; //ppa就是一个二级指针 第二颗星是说这是一个指针,第一个是说指针的对象是一个指针
//int*** pppa = &ppa 三级指针
printf("\n");
printf("%p----%p----%p\n", &a, &pa, &ppa);//008FFCD8----008FFCCC----008FFCC0
printf("%d====%d====%d\n", a, *pa, **ppa);//10====10====10
//如果修改指针变量的值,原本指向的变量值也会改变
**ppa = 20;
printf("%d---%d\n", **ppa, a);
}
那么ppa就是一个二级指针的类型,它所存储的内容是指针pa的地址。那么二级指针能用来干什么?用的比较常见的也就是在二维数组里了(事实上一级指针也能操纵二维数组)。
首先分析:
二级指针的一次解引用:取出一维数组的地址;
二级解引用:取出一维数组的值
那么思路清晰了,就可以操作二维数组了
#include
#define ROW 5
#define COL 5
void main()
{
int array[ROW][COL] = { 0 };
int* pa;
int** ppa;
int i, j, k = 0;
pa = array;
ppa = &pa;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
*(*(ppa)+k) = k;
k++;
}//赋值:
//0 1 2 3 4 5 6 7 8 9 10 11 12
//13 14 15 16 17 18 19 20 21 22 23 24
}
for (i = 0; i < ROW; i++)
{
printf("\n");
for (j = 0; j < COL; j++)
printf("%5d", *(*(array + i) + j));
}//结果如下:
/* 0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24*/
}
这里的array就相当于一个二维数组,也可以当一维数组使用。关于指针对数组的操纵,基本上就是对步长的理解,可以去看一看笔者写的指针详解1,里面会有比较详细步长的介绍。
=========================================================================
那么我们再来看一看指针数组的概念:
看一段代码:
//指针数组,是数组
int main()
{
void char_point();
void pointer();
void point_arr();
int arr[10] = { 0 }; //整形数组
char ch[5] = { 0 }; //字符数组
//int* parr[5]; //存放整形指针的数组 - 指针数组
//char* pch[5]; //存放字符指针的数组 - 指针数组
//指针数组怎么用?
point_arr();
pointer();
char_point();
return 0;
}
看完代码,应该就对指针数组有一个初步的认识了。那么指针数组,类型就应该是:
void point_arr()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int arr4[] = { 4,5,6,7,8 };
int* parr[] = { arr1,arr2,arr3,arr4 };
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
printf("%d ", *(parr[i] + j));
}
printf("\n");
}
}
即数组的元素类型是指针。那么就像上面的代码一样,指针数组可以更加方便的操作一系列一维数组。操作的手段在上面的代码中也已经给出。本质依然是步长和解引用。
那么这次的指针详解到这里也就结束了,喜欢的可以点个赞给个支持。