值传递是实际参数向形式参数传递参数值的一种方式
值传递的特点是“参数值的单向传递”,对实参没有任何影响,被调用函数
2.地址传递方式地址传递方式是实际参数向形式参数传递内存地址的一种方式。
调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。由于形式参数和实际参数地址相同,即它们占用相同时间的内存空间。所以发生调用时,形式参数值的改变会影响实际参数的值。
3.数组作为函数参数数组作为函数的参数,进行数据的传递。
一种是把数组元素作为实际参数使用:数组元素可以看成一个普通变量,因此他作为函数实际参数使用时与普通变量完全相同,在发生函数调用时,把实际参数的数组元素的值传送给形式参数,实现单向的值传递。
另一种是把数组名作为函数的形式参数和实际参数使用:
(1)用数组名做函数参数时,要求形式参数和相对应的实际参数都必须是类型相同的数组,都必须有明确的数组说明。
(2)在用数组名做函数参数时,传递的不是值,因为函数名就是数组的首地址,因此在数组名作函数参数时传送的是地址,也就是说把实际参数数组的首地址赋予形式参数数组名。形式参数数组名取得该首地址之后,也就等于获得了实际的数组。
4.指针变量作为函数参数函数的参数可以是整型,实型,字符型等基本数据类型,还可以是指针类型。使用指针作为函数的参数,实际上向函数传递的是变量的地址。
(1)C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式,用指针变量作为函数参数时同样要遵循这一规则。
(2)不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值
注意:
p是指针变量,*p是p指向的变量的值。
假设有一个形参和实参那么就有
这两者的的区别:
void swap(int* p1, int* p2)
{
int* p;
p = p1;
p1 = p2; //使p1和p2的值互换。
p2 = p;
}
void swap(int* p1, int* p2)
{
int p;
p = *p1;
*p1 = *p2; //*p1,*p2交换意味着p1和p2指向的存储单元的值进行了交换
*p2 = p;
}
通常用整型变量而非指针变量作为*p1和*p2进行交换的辅助变量。
结构体数组做函数参数,可以分为两种情况:结构体数组名作为函数参数和结构体数组元素作为函数参数。
结构体数组的定义和初始化:
1.先定义结构体类型,再定义结构体数组。
struct student
{
int num;
char name[20];
char sex;
float score;
};
struct student stu[30];
2.在定义结构体类型的同时定义结构体数组。
struct student
{
int num;
char name[20];
char sex;
float score;
}stu[30];
3.直接定义结构体数组。
struct
{
int num;
char name[20];
char sex;
float score;
} stu[30];



