这是高中信息学竞赛没有仔细学的一个方面,所以这里又补了一下漏。
直接运行以下代码并且仔细阅读相信你也可以理解指针和二重指针的作用。
#include<stdio.h>
int a=10,b=100;
void njc(int *q){
printf("
*q=%d
q=%d
&q=%d
",*q,q,&q);
q=&b;
printf("
*q=%d
q=%d
&q=%d
",*q,q,&q);
}
void njc2(int **q){
printf("
**q=%d
*q=%d
,q=%d
",**q,*q,q);
*q=&b;//这里有变化
printf("
**q=%d
*q=%d
,q=%d
",**q,*q,q);
}
int main(){
int *q;
printf("先查看三个变量的地址
&a=%d
&b=%d
&q=%d
",&a,&b,&q);
//如果不传入函数直接在外面更改指针的指向
printf("如果不传入函数直接在外面更改指针的指向
");
q=&a;
printf("查看一下
*q=%d
q=%d
&q=%d
",*q,q,&q);
q=&b;
printf("查看一下
*q=%d
q=%d
&q=%d
",*q,q,&q);
q=&a;
printf("
发现是可以成功的!!!");
//但是如果我们采用这种函数的方式进行更改
printf("
但是如果我们采用这种函数的方式进行更改
");
njc(q);
printf("以上为函数输出,以下为主函数输出
");
printf("查看一下
*q=%d
q=%d
&q=%d
",*q,q,&q);
//发现函数中是成功的,但是主函数中是有问题的
//这是因为,编译器要为函数的每个参数制作临时的副本(也叫临时变量),所以上面函数
//中的q相当于是主函数中的q的副本,副本的变化是不会影响主函数中的原本的变化的
//所以碰到这种问题,我们应该采用二级指针来解决
printf("
");//这里换了很多行
printf("如果不传入函数直接在外面更改指针的指向
");
q=&a;
printf("查看一下
*q=%d
q=%d
&q=%d
",*q,q,&q);
q=&b;
printf("查看一下
*q=%d
q=%d
&q=%d
",*q,q,&q);
q=&a;
printf("
发现是可以成功的!!!");
printf("
这时我们请上二级指针原来q指向是a=10
");
njc2(&q);
printf("以上为函数输出,以下为主函数输出
");
printf("查看一下
*q=%d
q=%d
&q=%d
",*q,q,&q);
}