一、二级指针相关概念
一个指针变量可以指向整型变量、实型变量、字符类型变量,当然也可以指向指针类型变量。当这种指针变量用于指向指针类型变量时,则称之为指向指针的指针变量。这种双重指针如图1所示。
图1:
整型变量i的地址是&i,将其值传递给指针变量p1,则p1指向i;同时,将p1的地址&p1传递给p2,则p2指向p1。这里的p2就是前面讲到的指向指针变量的指针变量,即指针的指针。指向指针的指针变量定义如下:
类型标识符 **指针变量名;
例如:
int * *p;
其含义为定义一个指针变量p,它指向另一个指针变量,该指针变量又指向一个基本整型变量。由于指针运算符“*”是自右至左结合
,所以上述定义相当于:
int *(*p);
既然知道了如何定义指向指针的指针,那么可以将图1用图2更形象地表示出来。
图2:
#include<stdio.h>
int main()
{
int data = 10;
int *p1 = &data;
printf("data的地址是:%p,data的内容是:%d\n",&data,data);
printf("p1保存data的地址是:%p,p1存放的内容是%d\n",p1,*p1);
int **p2 = &p1;
printf("p2保存p1的地址是:%p,p2存放的内容是%p\n",p2,*p2);
printf("**p2=%d\n",**p2);
int ***p3 = &p2;
printf("p3保存p2的地址是:%p,p3存放的内容是%p\n",p3,*p3);
printf("***p3=%d\n",***p3);
return 0;
}
输出结果:
p1、p2、p3和data之间的传递过程图:
多级指针就是层层嵌套的指针,和一级指针类似
二、运用二级指针实现一个小demo
问题:输出二维数组中的任意一个一维数组:
//Test6.c
#include<stdio.h>
void getPos(int data,int (*p)[3],int **pos)
{
*pos = *(p+data);
}
int main()
{
int arr[][3]={{1,2,3},{23,4,5},{12,34,54}};
int iNum,i;
int *iPos;
printf("输入0、1或者2:\n");
scanf("%d",&iNum);
getPos(iNum,arr,&iPos);
for(i=0;i<3;i++)
{
printf("%d ",*iPos++);
}
putchar('\n');
return 0;
}
输出结果: