指针详解2:二级指针与指针数组

二级指针,顾名思义,是个二次的指针,也就是指向指针的指针

基本类型如下:
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");
	}
}

        即数组的元素类型是指针。那么就像上面的代码一样,指针数组可以更加方便的操作一系列一维数组。操作的手段在上面的代码中也已经给出。本质依然是步长和解引用。

那么这次的指针详解到这里也就结束了,喜欢的可以点个赞给个支持。

你可能感兴趣的:(p2p,c语言)