最近在写队列函数时,在调试过程中碰到形参的一些问题,作为心得写在这边。
1.函数的形参属于局部变量,仅在定义的函数内有效,函数返回后失效。
2.当在一个函数(比如main函数)内调用另外一个函数时,例如:
void fun(unsigned char x)
{
x = x+1;
}
int main(void)
{
unsigned char data = 0x10;
while(1)
{
fun(data);
uartWrite (UART0, data, sizeof(data), NULL);
}
}
运行结果:0x10
虽然main函数调用fun函数,但是运算之后没有返回值,也就是data的值没有更新,还是0x10。
因此如果要通过一个函数改变某个变量的值,该函数必须要有返回值。将上述代码稍作修改:
unsigned char fun(unsigned char x)
{
x = x+1;
retrun x;
}
int main(void)
{
unsigned char data = 10;
while(1)
{
data = fun(data);
uartWrite (UART0, data, sizeof(data), NULL);
}
}
运行结果:0x11
3.当全局变量作为形参输入函数进行运算时,分如下几种情况:
(1)函数无返回值
unsigned char data = 10;
void fun(unsigned char x)
{
x = x+1;
}
int main(void)
{
while(1)
{
fun(data);
uartWrite (UART0, data, sizeof(data), NULL);
}
}
运算结果:0x10
由此可见,当全局变量作为参数输入函数进行运算时,其本身的值并未改变。
也就是说,全局变量作为形参输入函数进行运算时,其作用相当于局部变量,函数返回后失效。
(2)函数有返回值
unsigned char data = 10;
unsigned char fun(unsigned char x)
{
x = x+1;
retrun x;
}
int main(void)
{
while(1)
{
data = fun(data);
uartWrite (UART0, data, sizeof(data), NULL);
}
}
运算结果:0x11
其实,这边全局变量data在fun函数内部的作用与例(1)一样,不过它将计算结果赋值于data,因此打印出来的data值为0x11。
(3)全局变量直接用于函数内部,不作为形参
unsigned char data = 10;
void fun()
{
data = data+1;
}
int main(void)
{
while(1)
{
fun();
uartWrite (UART0, data, sizeof(data), NULL);
}
}
运算结果:0x11
全局变量的作用域为整个程序,只要不作为函数形参输入,它的计算值会实时更新。因此这边输出0x11。
文章对局部变量和全局变量作为形参输入进行了分类讨论,希望对相关同行有一定帮助。