如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。
假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:
int a =100;
int *p1 = &a;
int **p2 = &p1
指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址。
C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。
- p1 是一级指针,指向普通类型的数据,定义时有一个*;
- p2 是二级指针,指向一级指针 p1,定义时有两个*。
void getMem(char **p2)
{
*p2 = 400; //间接赋值 p2是p1的地址
}
void getMem2(char *p2)
{
p2 = 400; // p2跟p1没有关系,不会影响实参
}
//二级指针
void main()
{
char *p1 = NULL;
char **p2 = NULL; //二级指针
p1 = 0x11;
p2 = 0x22;
//直接修改p1的值 (栈)
p1 = 0x111;
//间接修改p1的值
p2 = &p1;
*p2 = 100;//间接赋值 p2是p1的地址
printf("p1:%d \n", p1); //100
getMem(&p1);
printf("getMem p1:%d \n", p1); //400
getMem2(&p1);
printf("getMem2 p1:%d \n", p1); //400
system("pause");
return;
}