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;
}

运行结果