• C语言-函数


    赋值与参数引用机制

    赋值

    不同于下面的参数引用机制

    对于数值型

    赋值修改,并不会改变内存地址
    inplace 操作不会改变内存地址(inplace操作也包括自增自减)

    #include 
    int main()
    {
        int a=1;
        printf("%p\n",&a); // 000000000061FE1C
        a=100;
        printf("%p\n",&a); // 000000000061FE1C,地址不变
    	
    	a+=100
    	printf("%p\n",&a); // 000000000061FE1C,地址不变
    	
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    参数引用机制/copy

    形参与函数内的其他局部函数一样,在进入函数时被创建,退出函数时被销毁

    值传递

    把实际的值复制给函数的形参,不共享内存

    #include 
    int main()
    {
        int a=20;
        int b=10;
        int c=a;
        c+=1;
        printf("a %d\n",a);
        printf("c %d\n",c);
        printf("a %d\n",a);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    进阶

    想当于复制,内存地址不一样
    且修改B不会影响A

    #include 
    int main()
    {
        int a=20;
        int b=10;
        int c=a;
        printf("%p\n",&a); // 000000000061FE18
        printf("%p\n",&c); // 000000000061FE14
        c+=1;
        printf("a %p\n",&a); // 000000000061FE18
        printf("c %p\n",&c); // 000000000061FE14
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    引用传递

    形参为指向 实参地址 的指针,当对 形参的指向操作时,就相当于对 实参 本身进行的操作

    参数引用扩展 c/python

    python的传值方式是按照c++中传指针的方式传值的,即不是引用也不是值。如果对象是可变的,那么操作是在传入对象上操作的,如果是不可变的,那么操作后相当于这个标识符指向了另一个对象
    (c++传指针本质上也是值传递,只不过传的是地址值,这时候由于是值传递地址值不会被修改,但是存放在地址里的实参的值是可修改的,这时候对应于python传入对象可变的话相当于就在原对象地址上修改这个对象。如果对象本身不可变,相当于传递的是指针常量,自然不能修改这个对象)

    python的赋值

    a=1
    a=2
    # 前后两次id(a)不同
    
    • 1
    • 2
    • 3

    函数范例

    返回类型(return_type):一个函数可以返回一个值;不返回值得时候return_typevoid
    参数(parameter_list):形参列表

    return_type function_name(parmeter_list)
    {
    	...;
    }
    
    • 1
    • 2
    • 3
    • 4

    函数声明与定义

    函数声明会告诉 编译器 函数名称 及 如何调用函数
    函数的实际主体可以单独定义
    形参的名称并不重要,只有参数的类型是必须的

    // 方法1
    int max(int num1,int num2)
    {
    	...
    }
    
    // 方法2
    int max(int num1,int num2); //注意是分号
    
    // 方法3
    int max(int,int)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    多文件的函数调用与声明

    在A文件中声明和定义,在B文件中调用,则需要在调用函数的文件B的顶部声明函数

    常用函数

    strcat() // 拼接两个字符串
    
    memcpy() // 复制内存到另一个位置
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Linux学习——exec函数族和守护进程
    linux高级篇基础理论二(详细文档、LAMP、SHELL、sed正则表达式)
    SpringCloud OpenFeign token中转
    修改docker默认存储位置【高版本的docker】
    TypeScript-数据类型
    AJAX基础
    【C语言百炼成神】功法四 · 数组
    从零开始的Django框架入门到实战教程(内含实战实例) - 08 用户界面(内含图形验证码的生成和校验详解)(学习笔记)
    解析虚拟文件系统的调用
    OpenCV模块介绍
  • 原文地址:https://blog.csdn.net/L_fengzifei/article/details/126291514