• C语言的传参方式(int x)(int *x)(int &x)


     本人坚持更新C语言,数据结构,操作系统,前端知识,可以收藏+关注随时了解😜😜😜 

    目录

    C语言一共有三种传参方式

    1.传数值(int x)

    2.传地址(int *x)

    3.传引用(int &x)

    总结


    C语言一共有三种传参方式

    1.传数值(int x)

    1. void test(int x){
    2. }

    就是把你的变量的值传递
    给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。

    注意:形参和实参永远不是一个变量

    最经典的例子就是交换两个数的值, 当函数调用的时候,实参传给形参时,形参将是实参的一份临时拷贝,所以对形参的修改是不影响实参的,如果用这种方式传参,只是交换了形参的值,不会真正的交换两个数的值

    1. void exchange(int a, int b)
    2. {
    3. int t;//定义中间变量
    4. t = a;
    5. a = b;
    6. b = temp;
    7. }
    8. int main(int argc, char const *argv[])
    9. {
    10. int a = 3;
    11. int b = 5;
    12. exchange(a, b);
    13. printf("----------------------\n");
    14. printf("a=%d\n", a);
    15. printf("b=%d\n", b);
    16. return 0;
    17. }

    2.传地址(int *x)

    就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。

    1. void exchange_3(int *p, int *q)
    2. {
    3. int t;
    4. //如果要互换*p和*q的值,则t必须定义为int,不能定义成int*,否则语法错误
    5. t = *p; //p的数据类型是int*,*p的数据类型是int
    6. *p = *q;
    7. *q = t;
    8. }
    9. int main(int argc, char const *argv[])
    10. {
    11. int a = 3;
    12. int b = 5;
    13. exchange_3(&a, &b);
    14. printf("----------------------\n");
    15. printf("a=%d\n", a);
    16. printf("b=%d\n", b);
    17. return 0;
    18. }

    但是值得注意的是,指针变量的大小永远只占4个字节,所以用指针来传递的话,会更快,效率也更高。

    3.传引用(int &x)

    引用实际上是某一个变量的别名和这个变量具有相同的内存空间。 

    实参把变量传递给形参引用,相当于形参是实参变量的别名对形参的修改都是直接修改实参

    在类的成员函数中经常用到类的引用对象作为形参,大大的提高代码的效率

    例如我们在初始化一个栈的时候

    1. int IninStack(SqStack &S)
    2. {
    3. S.base = (int *)malloc(STACKSIZEINIT * sizeof(int));
    4. if (!S.base)
    5. {
    6. exit(-1); //内存分配失败,退出程序
    7. }
    8. S.top = S.base; //栈顶指针和栈底指针指在同一块存储单元
    9. S.stacksize = STACKSIZEINIT;
    10. return 1;
    11. }

    总结

    声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

    引用传递可以看成在值传递的基础上,在函数定义和声明的形参变量前加一个 &,其它的使用和值传递完全相同,因此也看出引用传递更加方便

  • 相关阅读:
    Vue3快速入门
    Android 网络编程 记录
    数据类型优化
    SpringBoot+WebSocket实现即时通讯(三)
    libyuv 海思平台编译测试
    第六章 树与二叉树
    Linux 系统管理工具 supervisor 详解
    SpringMVC(四):SSM整合
    【路径规划】基于Dijkstra实现机器人二维路径规划附完整matlab代码
    (Java高级教程)第五章Linux使用和程序部署-第二节:Linux常用指令和VIM的使用
  • 原文地址:https://blog.csdn.net/weixin_46637351/article/details/126046567