C语言中指针作为函数形参的用法

1. 问题    

    问题一,如下代码,为通常新手所犯的错误。主函数Test()中,直接将指针变量作为形参传输给被调用函数GetMemory(),即使被调用函数修改形参值,其值也无法传给主函数。

void GetMemory( uint8 *p )
{
  *p = 100;
}

void Test()
{
  uint8 *str = NULL;
  GetMemory(str);
}

    问题二,如下代码,尝试在外部函数中修改全局变量的值。

static uint8 Test_Data1 = 56;

void HVTest_function2Client(uint8 *data)
{
   data = &Test_Data1;
}

void HVTest_function3Server(uint8 *data)
{
  *data = 58;
}

void main(void)
{
	uint8 lu8_Tst = 0;

	HVTest_function2Client(&lu8_Tst);
	HVTest_function3Server(&lu8_Tst);
}

2. 解决方式

    对问题一而言,以指针形参传值,且值能被修改的方式有如下两种。

    方式一:将局部变量的地址作为形参,传给被调用函数。

void GetMemory( uint8 *p )
{
  *p = 100;
}

void Test()
{
  uint8 str = 0;
  GetMemory(&str);
}

方式二:定义全局变量,取全局变量的地址作为形参,传输给被调用函数。

uint8 gu8_Tmp = 0;
void GetMemory( uint8 *p )
{
  *p = 100;
}

void Test()
{
  GetMemory(&gu8_Tmp);
}

   

    对问题二而言,传入被调用函数HVTest_function2Client()的是一个局部变量的地址,通过形参可以修改原变量的值,但不可能修改地址。所以,编译器提示该形参未被使用。

3. 总结

    3.1 形参与实参的最主要区别是,实参有被分配内存和赋值,而形参没有。

    3.2 函数的形参在函数调用结束后,就会释放所分配的内存单元。

    3.3 使用指针作为函数的形参,只有对指针所指对象进行的操作才会改变实参的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值