一、二级指针
(1)基本解释
int i = 1;
int *p1 = &i;
int **p2 = &p1;
- 1、int ** p2 可以把它分为两部分看,即int * 和 ( * p2)
- 2、后面 ( * p2) 中的“ * ”表示是一个指针变量
- 3、前面的 int * 表示指针变量 ( * p2) 只能存放int*类型变量的地址
- 4、p2 = &p1; *p2 = &i ; ** p2 = i;
(2)程序代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1;
int *p1 = &i;
int **p2;
int **p3;
p2 = &p1; //二级指针要的是一级指针的地址,也可以开始赋值: int **p2=&p1;
*p3 = &i;
//地址相等: &i = p1 = *p2
printf("&i = %p\n", &i);
printf("p1 = %p\n", p1);
printf("*p2 = %p\n", *p2);
printf("*p3 = %p\n", *p3);
printf("\n");
printf("&p1 = %p\n", &p1);
printf("p2 = %p\n", p2);
printf("\n");
printf("i = %d\n", i);
printf("*p1 = %d\n", *p1);
printf("**p2 = %d\n", **p2);
printf("**p3 = %d\n", **p3);
exit(0);
}
(3)输出结果
二、二级指针的优点
- 二级指针不仅可以将外部参数传递到函数内部,而且可以将函数内部变量带出到函数外部
#include <stdio.h>
#include <stdlib.h>
void numptr(int **ptr)
{
static int num = 23;
*ptr = #
}
int main(void)
{
int *apple = NULL;
int *banana = NULL;
numptr(&apple);
printf("*****frist*****\n");
printf("apple: %d\n", *apple);
*apple = 100;
numptr(&banana);
printf("*****second*****\n");
printf("apple: %d\n", *apple);
printf("banana: %d\n", *banana);
exit(0);
}
输出结果:
xxx@xxx-virtual-machine:~/linux/linux_c/600CymTest$ ./503ptr2
*****frist*****
apple: 23
*****second*****
apple: 100
banana: 100
三、补充
- 1、一级指针 ———————> 变量取地址
- 2、二级指针 ———————> 一级指针的地址
- 3、三级指针 ———————> 二级指针的地址