C语言中——被调用函数与主函数中值和地址的变化以及形参和实参的定义和数据传递,用指针解决值在函数调用时得变化

  1. 1.1实参和形参的定义和数据传递。
  2. 2.1函数调用时变量地址的变化。
  3. 3.1用指针解决值在函数调用时得变化。

1.实参和形参

1.1定义:

在调用时有参函数时,主调函数和被调用函数之间有数据传递关系。在定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称为“实参”)。实际参数数可以是常量、变量或是表达式。

下面用代码进行分析:

#include
int test(int x)  //形式参数,需要包含变量类型,
{  int y;
	y=x+1;
	return y;

	
	
 } 
 int main()
{   
	int y,s;
	puts("请输入一个数: ");
	scanf("%d",&s);
	y=test(s);//实际参数 
	printf("%d",y);
	return 0;
	

}

上述代码中,根据上述定义: int test(int x):test是函数名,x是形参。y=test(s):s是实参。我是这样理解的。是因为输入一个数给了s,所以s变成实数,则是实参,由于x是处于接受值,所以没有固定的值,所以只是作为了形式参数

1.2数据传递:

在调用函数过程中,系统会把实参传递给被调用函数的形参。或者说,形参从实参得到的一个值。该值在函数调用期间有效,可以参加该函数中的运算。

在调用函数过程中发生的实参与形参间的数据传递称为“虚实结合”。

下面用代码进行分析:

比较两个数的大小

#include
int main()
{
   int max(int x,int y);          //对main函数的声明
   int a,b,c;                     
   printf("please enter two integer numbers:");//提示输入数据
   scanf("%d,%d",&a,&b);
   c=max(a,b);                    //调用max函数,有两个实参,大数赋给c
   printf("max is %d\n",c);       //输出大数c
   return 0;
}
   
 int max(int x,int y)              //定义max函数,有两个参数
 {
   int z;                          //定义临时变量z
   z=x>y?x:y;                      //把x和y中的大着赋给z
   return (z);                     //把z作为max函数的值带回卖弄函数       
 }
   

程序分析:

主函数中包含了一个函数调用max(a,b)。max后面括号内的a和b是实参。

a和b是在main函数中定义的变量,x和y是函数max的形式参数。通过函数调用,在两个函数之间发生数据传递,实参a和b的值传递给形参x和y,在max函数中把x和y中的最大者赋给变量z,z的值作为函数值返回main函数,赋给 变量C。

2.函数调用

2.1函数调用时变量地址的变化

1.首先说明:同一变量在被调用函数中的地址与在main函数中的地址是不一样。下面用实例证明:

两个数进行交换

#include
void data_ShuJu(int data0,int data1)        //开始声明函数,在main函数就可以不用声明
{
     int t;                                 //定义变量t,用于交换数据
	 t=data0;
	 data0=data1;
	 data1=t;
	 
   }
 
 int main()
 {
    int a=10;
	int b=20;
	
	printf("交换前的数据:%d %d\n",a,b);
	data_ShuJu(a,b);
	printf("交换后的数据:%d %d\n",a,b);
	return 0;
	}
	
运行结果:
交换前的数据:10 20
交换后的数据:10 20

在这就会发现a和b的值没有发生改变,

主要是存储数据的地址或内存空间没有发生改变,由于值是与地址或内存空间对应的,所以a和b的值未发生改变。这其实是值得思考的问题,那如果让a和b的值发生改变我们将该怎么做呢?

由于指针是发生地址改变的,那接下用指针可以解决掉这个问题,下面用代码进行证明,还是上述例子。

#include
void data_ZhiJin(int *data0,int *data1)        //开始声明函数,在main函数就可以不用声明
{
     int t;                                 //定义变量t,用于交换数据
	 t=*data0;
	 *data0=*data1;
	 *data1=t;
	 
   }
 
 int main()
 {
    int a=10;
	int b=20;
	
	printf("交换前的数据:%d %d\n",a,b);
	data_ZhiJin(&a,&b);
	printf("交换后的数据:%d %d\n",a,b);
	return 0;
	}
	

运行结果:
交换前的数据:10 20
交换后的数据:20 10

大家可以进行实践,自已可以体会一下语言的妙处啊!

你可能感兴趣的:(c语言,c++,单片机)