1.声明与定义的区别:
函数的声明只是说明函数的名字,不涉及函数的实现
,只包括:类型标识符,函数名,形参列表;
而函数的定义包括:类型标识符,函数名,形参列表以及函数体。
2.简单的变量或数组元素作为函数参数:
调用函数不会影响到主函数中实参变量的值,即是单向的;
3.指针变量或数组名作为函数参数:
调用函数不会影响到主函数中实参指针变量或数组名所表示的地址,即对被调用函数中的指针或数组名进行操作不会被传递到主函数中,是单向的;但是指针或数组名所代表的地址当中的内容会随调用函数对这段地址内容的操作而改变;
4.回调函数:
(1)定义:通过指针调用的函数被称为回调函数。
(2)优点:借用回调函数可以实现查找函数与类型无关
5.printf的实现:
在标准C语言中定义了一个头文件专门用来对付可变参数列表,它包含了一组宏和一个va_list 的typedef声明。
printf()函数的原型为:
Int printf(const char *format, ...);
故实际调用可以用以下形式:
printf(“%d”,i);
printf(“%s”,s);
Printf(“the number is %d, string is:%s”,i,s);
6.结构体数组作函数参数如何传递:
a) 结构体数组元素作为实参:服从数据的单向值传递原则,符合结构体作为实参规则,采取单向“值传递”方式将结构体变量所占的内存单元的内容全部顺序复制给形参。注意,当实参的成员中包含数组时,形参相应的成员接收到的是一个地址。
b) 结构体数组名作为实参:服从数据的单向值传递原则,同整形数组名作为实参一样,传递给形参的是内存中已指定单元的地址,调用过程中形参数组与实参数组占用同一段内存单元,故对数组的操作表现为双向性。
7.如何利用全局变量编写有多个返回值的C语言函数
把要返回的多个值定义为全局变量,当函数被调用时,全局变量被更改,再把更改后的全局变量值应用于主调函数中。函数被调用后被更改的全局变量值即为函数的数个返回值。例如:
# include <stdio.h>
int max, min;
void max_min(int a, int b, int c)
{
max = (a > b) ? a : b;
max = (max > c) ? max : c;
min = (a < b) ? a : b;
min = (min < c) ? min : c;
}
int main()
{
int a, b, c;
printf("Please input three numbers:\n");
scanf("%d%d%d", &a, &b, &c);
max_min(a, b, c);
printf("max = %d min = %d\n", max, min);
return 0;
}
8.如何利用传递数组指针编写有多个返回值的C语言函数
把多个返回值作为数组元素定义为一个数组的形式,并使该数组的地址作为函数的形式参数,以传址方式传递数组参数。函数被调用后,形参数组元素改变导致实参改变,再从改变后的实参数组元素中获得函数的多个返回值。
9.如何利用传递结构体指针编写有多个返回值的C语言函数
把要求返回的数个值定义为一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改也是对实参结构体的修改,函数被调用后获得的实参结构体成员即函数的多个返回值。
10.可变长参数中类型为函数指针:
以va_arg为例:
#define va_arg(argp, type) \
(*(type *)(((argp) += sizeof(type)) - sizeof(type)))
其中,argp的类型是char *,若想用va_arg从可变参数列表中提取出函数指针类型的参数,可将函数指针用typedef定义成一个独立的数据类型,例如:
typedef int (*fun)();
这时再调用“va_arg(argp, fun)”,将被扩展成:
(* (fun *)(((argp) += sizeof (fun)) - sizeof (fun)))