【C语言 基础】函数的形参与实参

形参:形式参数
实参:实际参数
两者最大的区别:形参就是纯纯的工具人,被使用之后它的内存就会被释放,而实参是始终占在内存一片地方的数据,所以只要有它的地址,你就能找到它的值。

在网上查一查,到处都有说形参和实参区别的博客,就以我现在结合工程实际的体验来看,形参和实参的最大区别在于它们的作用域不大一样。
例如以下代码:

#include "stdio.h"

int NMSL = 5;
void Change_Mom(int a)
{
    
     
  a = 0;
}
int main()
{
    
    
 int MNSL = 5;
 Change_Mom(NMSL);
 Change_Mom(MNSL);
 return ;
}

请问,NMSL和MNSL谁会变成0?实际上都不会,因为它们在传入函数的时候已经是它们的拷贝,而并不是它们本身。这个数值的改变不会传回它们自身。那如果是这样呢?

#include "stdio.h"

int NMSL = 5;
void Change_Mom(void)
{
    
     
  NMSL = 0;
  MNSL = 0;
}
int main()
{
    
    
 int MNSL = 5;
 Change_Mom();
 return ;
}

不好意思,这段代码都不成立了,因为MNSL是创建于Main函数的局部变量,Change_Mom上哪认这个Main函数的儿子呢?但如果将MNSL = 0;屏蔽掉,就可以正常运行,并且你会发现NMSL的值变成了0;究其原因,是因为这个函数并没有使用变量输入,而是直接调用了NMSL,使用的就是它本人,它是全局变量,理论上在单片机中,你只要有它的Ram地址,你就可以找到它的值。那如果我需要在一个变量传入函数后改变它的值怎么办?可以如下操作:

#include "stdio.h"

int NMSL = 5;
void Change_Mom(int *a)
{
    
     
 *a = 0;
}
int main()
{
    
    
 int MNSL = 5;
 Change_Mom(&MNSL);
 return ;
}

这样做的原理是:我传入了局部变量位于内存的地址,而直接对该地址下的变量进行数值的改变,相当于我FBI直接踹了它家大门了。有的人就会说,UP主你纯tm忽悠,我明明写个数组进去也不需要传啥地址就能改里面的值,例如这样:
#include “stdio.h”

void Change_Mom(int arr[])
{
arr[0] = 1;
}
int main()
{
int arr[2]={0,1};
Change_Mom(arr);
return ;
}
我看你是完全不懂哦,数组名是数组首元素的地址,早八辈就把你的地址交给FBI啦!而至于你是数组的哪一个,都可以根据首元素地址进行类推,反正数组一定是连续的嘛!
更多详情请看:
https://blog.csdn.net/qq_61558455/article/details/126803970

猜你喜欢

转载自blog.csdn.net/qq_32006213/article/details/128818887