我的C语言学习之路-四-函数与递归

我的C语言学习之路-四-函数与递归,第1张

我的C语言学习之路-四-函数与递归

我的C语言学习之路-四-函数与递归

常用库函数变量的作用域和生存期函数自定义函数

常用库函数 1IO函数2字符串 *** 作函数3字符 *** 作函数4内存 *** 作函数5时间/日期函数6数学函数

程序的结构

    C程序是由许多函数组成的,其中最重要的就是函数main(),他是执行的起点。程序中的每个函数都是一个执行特定 *** 作的自包含单元。调用一个函数时,就执行该函数体内的代码,这个函数
    执行结束后,控制权就回到调用该函数的地方。

变量的作用域和生存期
    自动变量:变量在一个块内声明时创建,在这个块结束时销毁。全局变量:变量在一个块外创建,始终存在。作用域:给定变量可以在某个程序代码块中访问和引用,这个程序代码就称为变量的作用域。在作用域内使用变量是没有问题的,但是在作用域外使用会出现问题。生存期:变量存在的时间称为变量的生存期。
    一个函数的内部声明的变量完全独立与在其他函数或嵌套块内声明的变量。

函数

接收函数返回的信息有两种办法:

    使用函数的一个参数——通过函数的一个参数提供变量的值,这个函数会修改该变量的值。通过返回值接收函数返回的信息。
    实参:真实传给函数的参数,可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传送给形参。
    形参:函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),在函数调用完成后就自动销毁了,形式参数只在函数中有效。
    函数的调用:
    传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参
    传址调用:把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式;可以在函数内部直接 *** 作函数外部的变量。
自定义函数
    创建一个函数,必须指定函数头作为函数定义的第一行,跟着是这个函数放在括号内的执行代码。该代码块称为函数体。
    函数头:定义了函数的名称,函数参数(调用函数时传给函数的值的类型和个数)和函数返回值的类型。
    函数体:包含在调用函数时执行的语句。
Return_type     Function_name(Parameters-separated by commas-函数参数)
{
	函数体
}
    函数体内可以没有语句,但是必须有大括号。如果函数体内没有语句,返回类型必须是void。返回类型不是void的函数都在函数体内有一个return语句,返回一个指定返回类型的值。不能在一个函数体内定义另一个函数。返回值为void的函数不可能成为表达式的一部分。函数的命名:与变量的命名一致,但不能是保留字(int,double,sizeof等),也不能和程序中其他函数的名称相同,不要使用与任何标准库函数相同的名称。函数的参数:一系列变量名称和他们的类型,参数之间以逗号分隔,放在括号内,也可以没有参数,此时在括号中放置void。要把数组作为变元传递给函数,还必须传递一个额外的变元,指定数组的大小。如int SumIt(int x[],size_t n ),该函数有两个参数,第一个参数是一个int[]型的数组,第二个参数把数组的元素指定为一个size_t类型的值。该函数返回一个int类型的值。调用函数时,要使用函数名称,后跟放在括号内的变元。调用函数时指定的变元的类型,个数,顺序必须和函数头中指定的参数一致。数组直接使用数组名称即可。指定返回值的类型——Return_typereturn语句:退出函数,从调用函数中发生调用的那一点继续执行。第一个参数为数组类型时,变元可以是数组名或者*类型的指针,否则数组传参,传过去的不是整个数组,而是第一个元素的地址。如果函数要修改在调用函数中定义的变量,就需要将这个变量的地址作为变元传送。声明外部函数:extern Return_type Function_name(Parameters-separated by commas);

按值传递指针
给函数传送变元时,变元值不会直接传递给函数,而是先制作变元值的副本,存储在栈上,再使这个副本可用于函数,而不是使用初始值。


函数原型

    函数原型也称为函数声明,只需要在定义函数后面加入分号即可。可以不包括参数名。Return_type Function_name(Parameters-separated by commas);函数声明应放在源文件中,声明函数后,可在任意地方定义函数。若没有声明函数,定义函数必须在调用函数之前。

指针用作参数和返回值

    常量参数:可以使用const关键字修饰函数参数,表示函数将传送给参数的变元看作一个常量。只应用于指针参数。堆内存的释放分为两个阶段:数组元素的释放,释放存储字符串地址而分配的内存。

返回指针的风险

    会修改变量的值。为了避免干扰变元指向的变量,可以使用本地存储器存储返回的值。(在函数内部定义)决不返回函数中本地变量的地址。

递归:程序调用自身的编程技巧
递归的两个必要条件:存在限制条件 ,当满足这个限制条件,递归便不再继续;每次递归调用之后越来越接近这个限制条件;如果一直递归,会出现栈溢出(stack overflow)。
栈区:局部变量;函数形参
堆区:动态开辟的内存;malloc;calloc
静态区:全局变量;static修饰的变量

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713458.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存