首页 > 其他分享 >C语言笔记9

C语言笔记9

时间:2024-01-27 16:55:48浏览次数:24  
标签:调用 变量 函数 局部变量 笔记 C语言 全局变量 定义

 

 

 

函数的参数传递

形式参数:函数定义时的参数,简称形参。

实际参数:函数调用时的参数,简称实参。

实参与形参数目、类型和顺序应一致,占据不同存储单位。

 

screen-capture

理解单向值传递

每个函数都有自己的变量空间,参数也位于这个空间;

形参调用前不占内存单位,调用时对形参分配单位并传递实参的值。

调用结束后,形参单元被释放,实参单元仍保留并维持原值;

形参值的变化不会改变主调函数中实参的值,

 

screen-capture

一维数组做函数参数

实参、形参分别定义数组,名字可以相同,也可以不同;

调用时参数实现地址传递;

函数调用时实参用不带下标的数组名,必须有确切值;

形参数组和实参数组长度可以不相同,在调用时,只传送首地址而不检查形参数组的长度;

一维数组可以不指定大小;

对形参数数组的修改即是对实参数组的修改,函数无须返回数组。

 

screen-capture

二维数组做函数参数

函数定义中,形参数组定义可以省略第一维的大小,但是不能省略第二维的大小,因为必须知道列数才能正常计算一个·数组元素在数组中相对于第一个元素的偏移位置。

函数调用时,向函数二维数组的首地址。

函数的嵌套调用

嵌套调用:

在调用一个函数的过程中,又调用另一个函数。

C语言不能嵌套定义,但可以嵌套调用!

函数的递归调用

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

前者称为直接递归,后者称为间接递归。

 

screen-capture

用递归求解问题的特点

纯在递归的终止条件;

存在导致问题求解的递归方式。

递归方法:递推、回归。

使用递归的优缺点

优点:

程序简洁,代码紧凑。

缺点:

每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息。所以递归次数过多,可能引起堆栈溢出,且时间效率较差。

变量的作用域和生存期

变量的作用域:是指变量在程序中作用范围。C语言中变量要先定义、后使用。但是定义语句应该放在程序的什么位置?在程序的什么范围可以访问所定义的变量?作用域与变量定义的位置有关。

变量的生存期:生存期与变量的存储类型密切相关。

 

screen-capture

局部变量的规则

局部变量不会默认初始化:

编译系统不为局部变量分配内存单元,只是当被调用时,分配零时单元,调用结束后,变量就消失了。

不同函数中可以定义同名变量,它们占据不同的内存单位:

在复合语句中定义的变量,只在本复合函数中有效;

在同一块内(函数或复合语句内)不能定义相同的变量;

main函数中定义的变量也是局部变量,只在main 函数中有效。 main 函数也不能使用其他函数定义的变量。

全局变量

全局变量(外部变量):

在函数外面定义的变量称为全局变量。

作用域:

全局变量具有全局的作用域和生存期,从定义的位置到本文件结束都可以使用。

全局变量规则:

若全局变量与局部变量同名,则在局部变量的作用范围内,同名的全局变量不起作用;

没赋初值的全局变量默认得到0值;

任何函数都可以使用全局变量。

优点:

函数建数据联系:

同一文件中的一些函数应用全局变量,当某个函数中改变了全局变量的值,其他函数中的全局变量值也随之改变。

函数可以得到多个返回值。利用全局变量的这个特性,可以在函数间传递数据。

缺点:

全局变量在程序的全部执行过程中都占用存储单位。

降低函数的通用性。

使用过多,降低程序的清晰性。

变量的存储类型

从变量值存在的时间(即生存期)看,变量的存储有两种不同的方式:静态存储和动态存储

静态存储:

在 程序运行期间由系统分配固定的存储空间;从程序开始执行到程序结束。

动态存储方式:

在程序运行期间根据需要进行动态的分配存储空间;

从包含该变量定义的函数开始执行至函数执行结束。

 

screen-capture

局部变量的存储方式(自变量、静态局部变量、寄存器变量)

1.自动变量(auto)

函数中的局部变量,不做任何存储类别的说明都为自动变量

定义形式:[auto] 类型说明符 变量名;

说明:

自动变量必需在一个函数体的内部,分配在动态存储区。

自动变量不赋初值,其值不确定。每调用一次,重新赋值一次。

函数的形参也是自动变量。

“自动”体现在进入语句块是自动申请内存,退出时自动释放内存;对他们分配和释放存储空间的工作有编译系统自动处理

2.静态局部变量(static)

有时希望函数中局部变量的值在函数调用结束后不消失(以后一直存在,并重视保持它的最新值,既具有记忆性),既不释放存储单元此时可指定该变量为"静态局部变量“。

定义形式:

static类型说明符 变量名;

静态局部变量的特性

静态局部变量系统自动初始化为0,存放在静态存储区;生存期为整个程序运行期间;

静态局部变量和全局变量都是静态存储类型,但作用域不同;

静态局部变量在编译时赋初值,每次调用时不再赋初值,只保留调用结束时变量的值,其值在整个程序运行期间都不释放。

3.寄存器变量(register)

对频繁对频繁使用的变量,为减少存取变量花费的时间,C语言允许将局部变量的值存放在CPU运算器的寄存器中,称为“寄存器变量”,用关键字“register"说明。

定义形式:register 类型说明符 变量;

说明:

寄存器变量的类型一般只限于整型、字符型或指向整型、字符型的指针,且只用于局部变量和形参。

全部变量、局部静态变量不可以作为寄存器变量。

不能定义任意多个寄存器变量,因为一个计算机系统中寄存器的数目是有限的。不能取寄存器变量的地址。

 

screen-capture

全局变量的存储方法(外部类型、静态类型)

1.外部全局变量

一个文件中要引用其他文件中定义的全局变量,应该在需要引用此变量的文件中用 extern int x;

2.静态局部变量

一个文件中的全局变量仅限于定义它的文件应用而不能被其他文件访问,需要用static 进行说明。

例:static int y;

说明:

外部全局变量与静态全局变量在同一文件内的作用域一样;

外部全局变量可以被多个文件引用,而静态全局变量仅在定义它的文件内有效,在程序的其他文件中不可使用。

内部函数和外部函数

函数本质上是全局的,因为一个函数要被另外的函数调用。但是,也可以指定函数不能被其他文件调用。

根据函数能否被其他原函数调用,将函数区分为内涵数和外部函数。

内部函数

内部函数的定义

内部函数是只能被本文件中其他函数调用的函数,又称静态函数,函数的作用域仅限于本文件。

内部函数的定义格式

static int fun( int a, int b)

内部函数的作用

使用内部函数,可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,互不干扰。

这样不同的人可以分别编写不同的函数,而不必担心所用函数是否会与其他文件中函数同名。

外部函数

定义:

外部函数是允许被其它文件调用的函数。

外部函数定义格式

[extern] int fun (int a, int b)

C语言规定,如果在定义函数时省略 extern。则隐含为外部函数。

外部函数使用说明

在需要调用此函数的文件,要用 extern声明所用函数式外部函数。

例:在源文件A中另一源文件B中的函数fun, 则需要在源文件A中对函数fun 进行说明,格式为:extern int fun( );

 

screen-capture

编译预处理

 

screen-capture

宏定义

宏定义的一般格式:

#define 宏名 字符串

功能:在预处理时,将程序中宏定义之后出现的所有的宏名,用宏替换字符串替换成字符串的过程。

例如:

#define PI 3.1415926

说明

宏定义通常放在程序开头,以#开头,不加分号;

宏名一般习惯用大写字母表示。

一个宏名只能被定义一次。

宏定义的作用域:

从定义开始到程序结尾。在进行宏定义时,可以引用已定义的其他宏名。

对在字符串常量及用户标识符中,与宏名相同部分不做替换。当宏定义在一行写不下,换行时需要在行尾加换行符“"。

 

 

screen-capture


screen-capture

终止宏定义

在程序中想终止宏定义的作用,可以使用终止宏定义命令。

终止宏定义格式:#undef 宏名

 

 

 

 

screen-capture

screen-capture

screen-capture

screen-capture

条件编译

通常情况下,源程序中所有的行都参加编译,C允许有选择编译的程序行。

条件编译

程序中的一部分内容在满足一定的条件下才能进行编译,即对一部分内容制定编译条件。

条件编译的作用

可有效的提高程序的可移植性,并广泛地应用商业软件中,为一个程序提供各种不同的版本。

 

screen-capture

标签:调用,变量,函数,局部变量,笔记,C语言,全局变量,定义
From: https://www.cnblogs.com/LCGJ/p/17991645

相关文章

  • 《构建之法》阅读笔记一
    这篇阅读笔记是有关于邹欣教授的《构建之法:现代软件工程》的阅读笔记。其实最开始阅读这本书的的原因也只是因为老师的作业要求。最开始老师给我们做推荐的时候其实在文件上只有《构建之法》四个字。所以开始我一直以为这本书是一本偏向于有关于项目构建的的书。但是我在网络上去......
  • 《构建之法》读书笔记二
    我们据本书开始逐步的了解软件开发。首先,软件开发分为几个阶段:玩具阶段→业余爱好阶段→探索阶段→成熟的产业阶段。而在我们学习软件开发时也会经历以下几个阶段,首先是玩具阶段,这个阶段可能也就像我们高考完填报志愿时那样,对计算机有点兴趣,幻想着做出什么有意思的软件。这个时候......
  • 《构建之法》读书笔记三
    在书中软件工程师的成长章节中主要记录了:软件工程包括了开发、运用、维护软件的过程中的很多技术、做法、习惯和思想。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”,软件开发流程的目的是为了提高软件开发、运营和维护的效率,以及提升用户满意度、软件的可靠......
  • 单例模式笔记
    Singleton单例模式(SingletonPattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要显......
  • 1/27 学习进度笔记
    今日学习了DataFrame的代码构建--读取外部数据读取数据源包括text,csv,json,parquet四种数据源schema=StructType().add("data",StringType(),nullable=True)df=spark.read.format("text").\schema(schema=schema).\load("../data/sql/people.txt")df=......
  • C语言近段时间的总结
    一、电脑我们一开始买回来的电脑分成   硬件和操作系统   在二者中间有一层叫做  驱动层   。关于驱动层,目前我是这么理解的,它相当于是一座桥梁,是用来连接起虚拟的操作和现实的机器,因此可以通过现实当中的动作来使计算机完成一定的操作,也就是作为一个翻译来帮助......
  • [经验] c语言怎么对齐-如何使用C语言进行数据对齐
    C语言怎么对齐在C语言中,对齐(alignment)是一项非常重要的操作。它是指在内存中分配一个变量或数据结构的位置时,如何选择该位置。因为计算机硬件的限制,内存中的访问一般是按照字节顺序依次排列的。因此,如果一个变量被放在了一个不对齐的位置上,它的访问就会变得非常困难和低效。因此,对......
  • HCCF论文阅读笔记
    Abstract存在的挑战:使用更深层次的基于图的CF架构有过平滑效应,会导致难以区分的用户表示和推荐结果的退化监督信号在现实中是稀疏和偏态分布的,限制了CF范式的表达能力提出了一种新的自监督框架超图对比协同过滤(HCCF),通过一个超图增强的交叉视图对比学习架构来联合捕获局部......
  • Linux基础命令笔记(黑马)
    Linux基础命令Linux常用快捷键ctrl+c:强制停止程序运行ctrl+d:退出用户登录或某些特定程序的专属页面(不能用于vim)!历史命令前缀:执行历史中最后使用带有该命令前缀的命令例:!p相当于python、!t相当于tailctrl+r:可输入历史命令关键字搜索到想要到命令,按回车直接执行,按左......
  • 关于javascript的一些笔记(一)
    在script标签内使用import的时候,必须在script标签加上type=“module”当使用script标签加上type="module"的时候,是当所有模块都加载进来才进行工作的,也就是如果html在script标签下面也是可以正常运行的,他是后解析的当使用script标签加上type="module"的时候,script标签里面......