一、函数位置
函数声明:定义的函数要是放在主函数后面,就需要在主函数mian之前或mian函数中开头部分,对定义函数进行声明。
声明的时候要把函数的函数名、函数返回类型和参数个数类型等写清楚。
函数不用声明:如果在main函数之前进行,进行函数的定义,则不用进行函数的声明。(即声明和定义同时进行了)。
二、有无参数函数定义
类型名 函数名()
{
函数体
}
例如:无返回值的无参函数
void nihao()
{
printf("你好\n")
}
类型名 函数名(形式参数列表)
{
函数体
}
例如:有返回值的有参函数
int max(int x, int y)
{
int z;
z = x > y? x: y;
return z;
}
三、形参和实参
形参:定义的函数括号中的变量名称为“形式参数”。
实参:在主函数中调用另一函数时候,传递的参数。
1、实参传递给形参的时候,类型一般要相同,同时允许赋值兼容。例如:实参是float型3.6,形参是int。则先把3.6传给形参,再转换成整数3.(float转int一般直接取整数部分,抛弃小数部分)
2、形参在没有出现函数调用的时候,不占存储单元。在发生函数调用的时候,才进行内存的分配。调用结束,形参单元被释放。
3、传递方式,实参向形参的数据传递都是值传递,并且是单向传递。
4、返回值,如果函数值的类型和return的值不一样,以函数类型为准,将return值进行转换。
四、函数的声明
两种方式:
int max(int x, int y); //参数类型和参数名都写(用这样方式,方便阅读)
或
int max(int, int); //只写参数类型
五、函数作用范围
如果函数在主函数的外面进行声明,则该函数的作用范围对整个文件有效,即无论main还是其他函数都可以调用。
如果函数 a 在主函数或某函数的里面进行声明,则函数 a 的作用范围是主函数或某函数内部有效。
六、函数定义和调用
1、C语言中各个函数是相互平行的,即,一个函数内不能再定义另一个函数。但是,函数可以嵌套调用。
2、数组名作为函数参数。数组元素作为实参时,向形参传递的是数组元素,而用数组名作为函数实参时,向形参传递的是数组首元素地址。其中在定义形参数组时候,不用指定数组大小,因为地址传递,会一一对应实参数组元素的。
七、多维数组名作函数参数
定义多维数组作为函数形参的时候,可以指定每一维的大小,例如int arr[3][2]。也可以省略第一维的
大小,例如int arr[ ][2],因为数组存放的时候是按照行存放的。但是不能省略第二维的大小或都省略
八、函数return可以返回多个值
一般return只能返还一个值,但是可以通过一下几种方法。使调用一个函数可以返回多个值。
1、利用全局变量
2、利用数组指针传递
3、传递结构体指针
九、静态和动态存储方式(放在内存中)
数据分别放在静态和动态存储空间。其中,全局变量全部放在静态存储区,当程序开始执行使就给全局变量分配存储区,程序执行完成就释放。静态变量在程序执行过程中,占固定的存储单元。
动态存储区存放:1、函数形参。2、没有使用static的变量。3、函数调用时的现场保护和返回地址等。在函数调用的时候,开始分配动态存储空间,函数结束即释放,存储区是动态变化的。
在C语言中,每个变量和函数都有俩属性:数据类型和数据存储类型。
关键字auto型可以省略,因为不指定函数存储类型的都默认为自动存储类型,属于动态存储方式。
静态局部变量
1、在下次再调用该函数的变量的时候,该变量已有值(就是上次的值)。也就是说,局部静态变量在函数调用结束后,它并不释放而是保留当前值。
2、对静态局部变量在编译的时候就赋值了,即只赋值一次,在程序运行的时候它就已经有值了。(自动变量赋初值是在函数调用的时候进行,并每调用一次函数就赋值一次)
3、变量在定义时不赋值,静态变量在编译的时候会自动赋值为0(数值变量)或空字符 '\0'(字符变量),自动变量来说,其值不确定。
十、register寄存器变量(速度快,直接在寄存器上读取)
十一、静态存储区放有:1、全局变量 2、静态变量
十二、扩展外部变量的作用域
1、
其中,外部变量是在函数的外部定义的全局变量。 在使用extern进行外部变量申明的时候,类型名可以省略。例:extern int A,B;
也可写extern A,B;
2、将外部变量的作用域扩展到其他文件中
一个文件想使用另一个文件的外部变量:在一个文件中定义外部变量Num,而在另一文件中用extern对Nnum进行外部变量声明,即可。
十三、将外部变量的作用限制在本文件中(只能在本文件中使用,便于模块化,防止其他人在别的文件中误用该变量)