1、引例
【例1】 分析该程序,有哪些问题
int main()
{
swap(int p, int q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("(2)a = %d, b = %d\n", a, b);
}
swap(int p, int q)
{
int t;
t = p;
p = q;
q = t;
}
分析,该程序的功能是将a和b的值通过函数swap()进行交换,最后输出结果,但编译时会发生语法错误。 修改意见: 1、定义、声明用户自定义函数时,因该对函数添加返回值(即将第9行和第3行修改为
void swap(int p, 、int q)
)。 2、由于定义函数swap()时,参数p和q 都为整型,因此当调用该函数时,实际参数也应为整型(即,将第6行改为
swap(a, b)
) 修改后,该程序为
int main()
{
void swap(int p, int q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(a, b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int p, int q)
{
int t;
t = p;
p = q;
q = t;
}
程序的运行结果为:
可见,虽然程序可以运行,但并没有实现对a和b 的值交换。
2、值传递
2.1 定义
定义 1 (值传递)在调用函数的过程中,只将实参的值赋值(复制)给形参,被调用函数的内部对形参的修改,不会引起实参的变化。
【例2】值传递
int main()
{
void swap(int p, int q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(a, b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int p, int q)
{
int t;
t = p;
p = q;
q = t;
}
这种方式叫做值传递。在main函数执行过程中,当执行到调用函数swap(a,b)时,此时main函数跳转到swap函数继续执行,同时将实参a和b的值赋值(复制)给形参p和q,在swap函数内部借助变量t,实现形参p和q值的交换(然而形参p和q值的交换,对实参a和b的值并无影响,该语句只是将实参a和b的值赋值给形参p和q,仅此而已)。当调用函数执行完之后,返回到调用函数swap(a,b)的下一条语句继续执行。
3、地址传递
3.1 定义
定义 2(指针传递)在调用函数的过程中,将实参的地址传递给形参,被调用函数的内部对形参的修改,会同步引起实参的修改。
【例3】地址传递
int main()
{
void swap(int *p, int *q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int *p, int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
这种方式叫做指针传递。在执行调用函数的过程中,调用函数swap(&a,&b)将实参a、b的地址赋值给形参p、q,由于p、q为指针,那么p、q所指向的值与a、b的值必然相同(即p、q分别指向a、b)。在调用函数内部,对p、q所指向的值修改,即是对实参a、b值的修改。
4、引用
4.1 定义
定义 3(引用)对某一变量的重命名(别名),对引用的操作等同于对变量的操作。
4.2 声明
类型标识符 &引用名=目标变量名
【例4】
int b;
int &a=b; // 定义了引用a,即a是变量b 的别名
注:
(1)& 为标识符,不是取地址运算
(2)声明引用的同时,必须同时初始化
(3)当对目标变量声明引用之后,等同于目标变量有一个别名,即 a=1等价于b=1
(4)引用不占存储单元,对引用求地址,等同于对目标变量求地址,即 &a=&b
(5)对数组不能建立引用
4.3 用途
(1)函数参数传递,
用引用传递参数,由于引用不占用内存空间,对引用的修改即是对目标函数的修改,从而提高效率
4.4 与指针的区别
指针是通过指针变量对所指向的值间接操作,使用指针,程序的可理解性变差。而引用时目标变量的别名,对引用的操作就是对目标变量的操作。
【例5】引用传递参数
int main()
{
void swap(int &p, int &q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(a, b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int &p, int &q)
{
int t;
t = p;
p = q;
q = t;
}
运行结果