二级指针储存一级指针的地址,二级指针可以修改一级指针指向的内容,两者就像是上下级的关系。指针的有着多种变化,在数组、函数中都有着巨大的作用。
二级指针最大的特点就是有两个**,定义一个二级指针:int **p;
1.二级指针改变变量的值
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a=10;
int *p=&a;
int **pp=&p;//二级指针有两个**
printf("a=%d\n",a);
**pp=20;//二级指针直接修改一级指针指向的值
printf("a=%d\n",a);
printf("a=%d\n",*p);
system("pause");
}
由结果可以知道,即使一级指针p没有进行修改变量的值,只要二级指针修改了,变量的值也会发生改变。
2.改变一级指针指向的地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a=10;
int b=20;
int *p=&a;
int **pp=&p;//二级指针有两个**
printf("*p=%d\n",*p);
*pp=&b;//修改一级指向的地址
printf("*p=%d\n",*p);
system("pause");
}
二级指针改变了一级指针指向的地址。
3.二级指针遍历指针数组
#include<stdio.h>
#include<stdlib.h>
void main()
{
char *a[] = { "lwj", "jib", "hehe", "jiuzhe", "ffff" };
int len=(sizeof(a)/sizeof(char *));//求数组长度
for(char **p=a;p<a+len;p++)//a为指针,需要二级指针遍历
{
printf("%s\n",p);
}
system("pause");
}
4.二级函数指针改变一级函数指针
函数定义:int add();
函数指针定义:int (*p)();//把函数名去掉,再把指针名填上。
下面写一个用二级函数指针改变一级函数指针指向的函数。开始一级函数指针先指向加函数,用二级函数指针让一级函数指针指向减函数。
#include<stdio.h>
#include<stdlib.h>
int add(int a,int b)//加函数
{
return a+b;
}
int sub(int a,int b)//减函数
{
return a-b;
}
//改变函数指针指向的函数
void change_fun(int (**pp)(int,int))
{
*pp=sub;//*pp就是一级函数指针指向的函数地址
}
void main()
{
int a=20,b=10;
int(*p)(int,int)=add;//函数名就是函数的地址
printf("result=%d\n",p(a,b));//调用p指向的函数
change_fun(&p);//传入函数指针的地址
printf("result=%d\n",p(a,b));//调用p指向的函数
system("pause");
}
使用指针最大的麻烦是指针的类型,类型不一致就会出先各种错误。当指针的级数越来越多,就会变得难以理解。