先来看两个程序
程序1
#include<stdio.h>
void fun(int *p)
{
int b=22;
p=&b;
}
int main(void)
{
int a=1;
int *q;
q=&a;
printf("%d\n",*q);
fun(q);
printf("%d\n",*q);
return 0;
}
输出为
程序2
#include<stdio.h>
void fun(int *p)
{
*p=22;
}
int main(void)
{
int a=1;
int *q;
q=&a;
printf("%d\n",*q);
fun(q);
printf("%d\n",*q);
return 0;
}
输出为
对于程序2,不难理解
程序1,明明改变了P的指向了,为什么还是输出1呢?
其实问题的关键不是指针作为形参的问题,而是函数传参的问题。
q作为形参进入fun函数时,不是q本身进入参数,而是克隆了一个指针变量,这个指针变量的值和q相等。
所以,在程序1中,只是克隆的指针变量的指向发生了改变,而q的指向并没有发生改变。
为了验证这一结论,看程序3
程序3
#include<stdio.h>
void fun(int *p)
{
printf("in fun, p=%p,p的地址&p=%p\n",p,&p);
*p = 22;
}
int main(void)
{
int a=1;
int *p;
p=&a;
printf("%d\n",*p);
printf("in main, p=%p,p的地址&p=%p\n",p,&p);
fun(p);
printf("%d\n",*p);
return 0;
}
输出为
可看出,main中的p和fun中的p,值是一样的,但是是属于两个不同的指针变量。