- 一级指针做为函数参数可以去间接的修改实参的值,但并不能返回一个地址,来看一段代码
#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中的值,相当于改变了指针指向