指针作为函数形参

先来看两个程序

程序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,值是一样的,但是是属于两个不同的指针变量。

参考自https://www.cnblogs.com/heat-man/p/4646051.html

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页