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 使用指针作为函数的形参,只有对指针所指对象进行的操作才会改变实参的值。