关于指针作为函数参数问题的拓展讨论


常见问题

指针作为函数参数时,参数是如何传递的
指针作为函数参数时,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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值