目录
当实参传递给形参的时候,形参是有自己的内存地址的,形参是实参的一份临时拷贝,对形参修改不会影响实参。
还有个就是定义函数类型这儿,能不能用int 来定义,我觉得其实应该是不行,如果返回值应该是返回两个值,int 应该放不下,所以用的void来定义,需要交换值的话应该用上在函数里用上指针,这样就能把交换的值直接传到实参的地址里。
_____________________________________________________________________________
以上内容为指针函数的内容
函数开始
函数的概念
C语言中的函数就是一个完成某项特定的人物的一段代码。
C语言的程序其实是有无数个小的函数组合而成的,也可以说:一个大的计算任务可以分解成若干较小的函数(对应较小的任务)完成。
每一次使用库函数都要包含相应的头文件。
函数的语法形式
函数返回类型+函数名+(形式参数)。大括号里是函数体(需要自己设计),构成函数
返回类型:
函数返回接受的值的类型,一些函数需要返回值就需要给返回值定义一个类型,不需要返回值类型为“void”。
传参:
传的什么类型的参数,就需要在函数括号里定义相同类型的参数来接受。
形参,实参
只有在传递实参的时候,形参才会向内存申请空间,没有传参的话就不会提出申请。
形参和实参的地址不一样。
函数返回的值是暂时放在寄存器里的,回到主函数时接受返回值。
寄存器是集成在CPU上的,没有地址,内存才有地址。
形参只能在函数内部使用,除了函数就回收了。出了函数空间就没了。
return
return 后面可以是数值也可以是表达式,如果是表达式则先执行表达式,再返回表达式的结果。
在函数里return后面可以不写,反空值用void接受,也可以不写return。
return 返回后函数结束,如果后面还有代码则不执行。
如果返回的值,与接收类型不一样,则会强制转换为返回类型(函数名前面的类型)。
如果函数里面有if和分支,则要保证每种情况都有return返回,否则就会出错。
函数作为数组参数
主函数里的数组传参时,直接传数组名(多维数组和指针那儿会有点区别)就行。
接受时也用类型+数组接收。
- 函数的形式参数要和函数的实参个数匹配
- 函数的实参是数组时,形参也是可以写成数组形式的(估计还有其他办法)
- 形参如果是一维数组,数组的大小可以省略不写
- 形参如果是二维数组,行可以省略,但是列不能神略
- 数组传参,形参是不会创建新的数组的
- 形参操作的数组和实参的数组时同一个
函数里面不能再定义一个其他的函数。
单个文件的声明和定义
函数的申明直接把函数名抄一遍末尾加分号。
多个文件函数的声明和定义
在头文件.h里面放:函数的声明和类型的声明。
源文件里放函数的定义。
使用时:#include"( 头文件名 ).h",里面有函数的声明,把函数写在另一个.c文件里,主函数里调用就行。
如何生成静态库
右击文件名称(解决方案管理器的顶上),打开之后点击——属性(在最下面)——常规里面的配置类型——里面有静态库——然后生成解决方案——后缀名是 .lib 。
使用静态库
#pragma comment(lib, "add.lib")
static
作用域
哪里能使用哪里就是作用域
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程(多个文件应该也行)
生命周期
局部变量在出了生命周期就会销毁把申请的空间还回去。
全局变量只有程序运行结束才会销毁。
static修饰局部变量
出了生命周期不销毁 。
static修饰全局变量
只能在本文件内使用, 失去了外部链接属性(其他源文件不得使用)。
static修饰函数
也只能在本文件使用,失去了外部链接属性。
使用建议
在变量出了函数之后,我们还想保留值,就可以用static修饰
多个文件编译时,每个源文件都是单独编译的,
extern
声明外部符号。
在声明函数时,记得带上参数。
内存分区
栈区:存放局部变量和函数的参数。
堆区:动态内存分配。malloc , calloc , realloc , free.
静态区:全局变量和静态变量(程序不结束变量不销毁),只有程序结束,变量才会销毁,内存才会回收,但是作用域不变。