关于指针作为函数参数问题的拓展讨论
常见问题
指针作为函数参数时,参数是如何传递的
指针作为函数参数时,malloc函数返回动态内存问题
这一类问题我们经常会遇见,不注意的话很容易出错。并且对函数传参不是特别熟悉的话,理解起来很费劲。下面仔细分析一下这一类问题。
一、函数参数传递
在c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。
这一段文字解释对于很多初学者(包括博主自己)来说,是很难理解的,因此,我们只有多分析代码,从具体的代码中去掌握。
1.1普通值作为函数参数
// 普通值传递
#include <stdio.h>
void test(int num)
{
num = 5;
printf("in function test, num = %d\n",num);
}
int main(int argc, char* argv[])
{
int num = 9;
test(num);
printf("in function main, num = %d\n",num);
return 0;
}
在test函数内部,修改num的值,对实参num并无影响,即test函数接收到的实际上是外层num的一个拷贝。普通值作为函数参数时很容易理解,这里就不废话了。
1.2指针作为函数参数(一级指针)
示例1
//一级指针作为函数参数
#include <stdio.h>
void test(char *p)
{
p = "hello world";
printf("str = %s\n",p);
}
int main()
{
char *str = NULL;
test(str);
printf("str = %s\n",str);
return 0;
}
我们可能会认为主函数输出结果是hello world,但实际上调用函数test并没有改变指针str的值,我们通过框图来分析一下整个代码的运行过程
主函数中指针str指向null,调用函数test,指针str的值(也就是null的地址)传递给指针string,指针string也指向了null,接着字符串“hello world”的地址传给string,指针string指向了“hello world”的地址,函数调用结束后,“hello world”内存释放。我们发现主函数中指针str始终指向null这个地址,而null这个地址中的内容自始至终没有被修改过。
为了更好的理解,我们打印一些信息:
#include <stdio.h>
void test(char *string)
{
printf("string操作之前的指针:%p\n",string);
string = "hello world";
printf("string操作之后的指针:%p\n",string);
printf("string = %s\n",string);
}
int main()