一级指针做为函数参数

来源:互联网 发布:展览会门票软件 编辑:程序博客网 时间:2024/05/16 06:55
  • 一级指针做为函数参数可以去间接的修改实参的值,但并不能返回一个地址,来看一段代码
#include<stdio.h>#include<string.h>#include<stdlib.h>void fun1(int *n){    *n=6;}void fun2(char *str){    char *p=(char *)malloc(20*sizeof(char));    strcpy(p,"123456789");    str=p;}char *fun3(){    char *str=(char *)malloc(20*sizeof(char));    strcpy(str,"123456789");    return str;}int main(){    int num=3;    char *str=(char *)malloc(20*sizeof(char));    strcpy(str,"abcdefgh");    printf("num: %d\n",num);    printf("str: %s\n",str);    fun1(&num);    printf("fun1调用后num: %d\n",num);    fun2(str);    printf("fun2调用后str: %s\n",str);    str=fun3();    printf("fun3调用后str: %s\n",str);}

运行结果如下
这里写图片描述
我们发现以下几点

1.调用函数fun1后num值确实改变了

2.调用函数fun2后str值并没有改变

3.调用函数fun3后str值改变了

关于第一点无需多说,指针做函数参数确实可以间接改变实参的值,但奇怪的是执行fun2后并没有将fun2中变量 p的地址返回给实参str,这是因为不管是传值还是传地址实际上都是传值,形参只是实参的一个副本,当传参完成后形参与实参就没有了关系,所以无论在被调函数中对形参如何操作,都不会影响实参,所以掉用函数fun2不会使str值变化。而不同的是函数fun3是直接将地址做为返回值返回,所以函数fun3改变了str的值。

  • 如果想要用指针做函数参数去改变实参的值,可以使用二级指针,代码如下:
void fun(char **str){    char *p=(char *)malloc(20*sizeof(char));    strcpy(p,"123456789");    *str=p;}int main(){    char *str=(char *)malloc(20*sizeof(char));    strcpy(str,"abcdefgh");    printf("str: %s\n",str);    fun(&str);    printf("函数调用fun后str: %s\n",str);    return 0;}

结果如下
这里写图片描述
函数fun使str的值发生了改变,与函数fun2不同的是fun传递的是str的地址是一个二级指针,所改变的是&str中的值,相当于改变了指针指向