首页 > 其他分享 >关于函数(20250117)

关于函数(20250117)

时间:2025-01-17 20:57:22浏览次数:3  
标签:文件 函数 作用域 20250117 生存期 关于 数组 标识符 定义

补充

  1. 递归调用的补充:无限制的递归调用不会产生死循环,而是在栈区空间中,被调函数“入栈(保护现场)”产生的返回值地址占满整个栈区空间,程序直接崩溃。
  2. 数组作为参数传递,传递的是数组的首元素地址。字符串数组的末尾存在‘\0’,因此字符串数组作为函数参数时,不需要元素个数作为函数参数,而是“找“字符串末尾的'\0'。
  3. 二维数组作为函数参数时,可以将二维数组看作时一维数组的数组,而数组的地址是数组首元素的地址,即二维数组是数组指针的数组。

标识符发作用域和可见性

  • 作用域:标识符被定义的区域
  • 可见性:标识符能够被访问的范围

作用域

  1. 作用域分为局部作用域和全局作用域
  2. 局部作用域定义局部变量,从定义位置开始生效,该作用域末尾结束,局部变量存储在栈区,当局部变量未初始化是,其输出结果随机。
  3. 全局作用域定义全局变量,从定义位置开始生效,程序文件末尾结束。全局变量存储在全局区(静态区),当全局变量未初始化时,输出结果默认为0.
  4. 尽量使用参数传参,全局变量与调用该全局变量的参数高度绑定,耦合性较高。

可见性

  1. 标识符必须先定义再使用
  2. 同一作用域内不得定义同名标识符
  3. 在没有包含关系的不同作用域中定义的同名标识符不受影响
  4. 在两个或两个以上具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见

变量的生存期

        标量的生存期是指变量存在的周期。变量的生存期分为静态生存期和动态生存期。

静态生存期

        静态生存期在程序开始运行前分配内存空间,程序运行结束后内存空间销毁。常用于存放全局变量。

动态生存期

        动态生存期是作用域内定义开始,到函数运行结束。

  1. static:static函数修饰局部变量,用于修改变量的生存期,将其修改为静态生存期。局部作用域内函数运行结束后,内存空间不收回,直至程序运行结束后,内存空间销毁。当static修饰全局变量时,表示该变量仅在本程序文件可用,其它程序文件不可用。
  2. auto:系统自动分配内存空间,用完销毁。与之相对的是堆区内存空间,需要用户手动申请内存空间,手动销毁内存空间。
  3. register:修饰变量,表示用户建议CPU将该变量分配至寄存器中,以提高读写效率,但具体分配区域,取决于编译器。当运算过多过大时,系统可能会在CPU的寄存器中分配内存空间,以提高运算效率,被称作编译优先。register定义变量后,不得对变量取地址;

内部函数与外部函数

Linux系统可将多个C语言文件一同编译,编译命令如下:

gcc main.c func.c

        表示将main.c文件和func.c文件一起进行编译。

  • 函数调用的本质是CPU的指令跳转。
  • extern修饰标识符,说明是对全局变量的声明

预处理命令

        预处理命令用于改进编译环境,以提高编译效率。

        Linux可对C语言文件只做预处理,不运行,命令如下:

gcc -E main.c -omain.i

        表示将main.c文件只做预处理,不运行,并将其输出为main.i

        预处理命令包含宏定义、文件包含以及条件编译。

宏定义

        宏定义分为带参宏和不带参宏,为了区分其它标识符,通常宏命全部大写。不带参宏常用于为条件编译做准备,带参宏相较于函数调用效率更高,不需要加载函数入口和“保护现场”,但如果多次使用带参宏,则程序的复用性降低。

文件包含

        文件包含是按照文件地址,对文件内容进行替换。

        在Linux系统中,文件包含有’< >和‘" "‘两种使用方式,在使用时,有如下区别:

  1. 对于绝对路径,两者使用没有区别
  2. 对于相对路径,前者访问/user/include文件中,后者访问C文件同级目录

条件编译

        如果变量符合某个条件,就执行某段程序,否则跳过。防止多次对同一个头文件多次引用。

编程规范如下

#ifndef _MAIN
#if _MAIN

......

#endif

 

 

标签:文件,函数,作用域,20250117,生存期,关于,数组,标识符,定义
From: https://blog.csdn.net/2501_90172633/article/details/145213504

相关文章

  • 密码学——密码学基础、散列函数与数字签名
    1.密码学概述是信息安全的基础和核心,是防范各种安全威胁的重要手段,信息安全的许多相关知识都与密码学相关。密码学发展密码学是一门古老而又年轻的学科,几千年以前就存在,至今仍在发展演进。地位非常重要甚至起决定性作用。密码学源于希腊语kryptós,意为“隐藏的”。最早的......
  • JS — 对象、数组、函数
    对象英文名称:Object。类似于C++中的map,python中的字典,由key:value对构成。value可以是变量、数组、对象、函数等。函数定义中的this用来引用该函数的“拥有者”。例如:test.js中的内容为:letperson={//定义一个对象personname:'kitty',//对象的元......
  • Java初学者笔记-03、代码块内部类函数式编程
    代码块静态代码块static{}类加载时自动执行,类只会加载一次,静态代码块只会执行一次,往往用来对类的静态资源的初始化。实例代码块{},每次创建对象时执行,用来完成对象的初始化的。内部类一个类定义在另一个类内部,叫做内部类。使用场景:当一个类的内部,包含了一个完整的事物,且......
  • linux m、mm、mmm函数和make的区别
    在Linux内核开发和Android开发中,构建系统通常使用 make 命令来编译和构建项目。而在Android开发环境中,还有 m、mm 和 mmm 等命令,这些命令是Android构建系统的一部分,提供了更高效和便捷的构建方式。以下将详细介绍这些命令的功能、使用场景和区别。一、make 命令......
  • Java初学者笔记-03、代码块内部类函数式编程
    代码块静态代码块static{}类加载时自动执行,类只会加载一次,静态代码块只会执行一次,往往用来对类的静态资源的初始化。实例代码块{},每次创建对象时执行,用来完成对象的初始化的。内部类一个类定义在另一个类内部,叫做内部类。使用场景:当一个类的内部,包含了一个完整的事物,且......
  • LossVal:一种集成于损失函数的高效数据价值评估方法
    在机器学习领域,训练数据的价值并非均等:部分训练数据点对模型训练的影响显著高于其他数据点。评估单个数据点的影响程度通常需要反复重训练模型,计算效率低下。LossVal提出了一种创新方法,通过将数据价值评估过程直接集成到神经网络的损失函数中,实现了高效的数据价值评估。现代机器......
  • java 函数式编程
    1函数式创建对象new接口或抽象类时在花括号里面补全缺失的函数体可以创建匿名子类对象(非子类匿名对象)new普通类时在花括号里面直接重写方法可以创建匿名子类对象(非子类匿名对象)2lumbda表达式创建对象在函数式创建对象的基础上当接口或抽象类中仅有一个方法缺少函数体时可以......
  • QObject::moveToThread成员函数
    头文件包含......
  • zig 函数
    第四章:函数4.1函数定义和调用基本函数定义conststd=@import("std");//基本函数定义pubfnadd(a:i32,b:i32)i32{returna+b;}//无返回值的函数pubfnprintMessage(message:[]constu8)void{std.debug.print("{s}\n",.{message});}......
  • C++ lambda函数
    lambda函数是C++11标准新增的语法糖,也称为lambda表达式或匿名函数。lambda函数的特点是:距离近、简洁、高效和功能强大。 语法:​[](constint&no)->void{cout<<"亲爱的"<<no<<"号:我是一个一个aaaa。\n";};代码示例:#include<iostream>#include<vector>#......