第八章
1.无参函数的定义形式:
类型标识符 函数名()
{
语句
}
类型标识符和函数名称函数头;类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。
2.有参函数定义
类型标识符 函数名(形式参数列表)
{
声明部分
语句
}
在形参表列中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。
3.声明与定义不同
函数的声明就是声明一个函数的名字,只是说明函数的名字,不涉及函数的实现,即没有函数体,所以函数的声明只包括前三个部分。
函数的定义包含了一个函数的所有部分。
4.值传递:参数间数据单向的“值传递”
5.抽象理解形参和实参:
实参是一个抽屉的钥匙,在传参时,实参复制了一把钥匙传给形参,而被调函数拿到钥匙副本后,进行的操作可以分为两类:
(1)对钥匙本身做了一些操作(对指针本身进行操作)
(2)通过钥匙对抽屉里的内容进行了一些操作(对指针所指的变量进行操作)。
6.结构体数组做函数参数:
包括两类情况:结构体数组元素作为实参和结构体数组名作为实参。(都服从数据的单向值传递原则,前者传给形参的是某些变量的,后者传给形参的是结构体数组的首地址。)
7.如何编写有多个返回值的C语言函数
(1)利用全局变量
(2)传递数组指针
(3)传递结构体指针
8.回调函数:
当这个函数指针被用来调用它所指向的函数时,我们就说这个函数式回调函数。
应用:比较函数,查找函数
9.可变参数问题
(1)printf实现
(2)运行时确定
(3)可变长参数的传递
(4)可变长参数中类型为函数指针。
(5)可变长参数的获取
(6)定义可变长参数的一个限制。
10.第9题的解决
(1)定义一个头文件专门用来对付可变参数列表。
(2)通过定义一个“void*”类型的参数,用它来指向实际的参数区,然后在函数中根据需要任意解释他们的含义。
(3)定义被调用函数的参数为va_list类型,同时在调用函数中将可变长参数列表转换为va_list,这样就可以进行变长参数的传递。
(4)将函数指针用typedef定义成一个独立的数据类型。
(5)注意加宽原则
(6)至少得定义一个固定参数。