函数
1.代码块为空的函数可以实现存根的目的,保持程序在结构上的完整性,以便于编译和测试程序的其他部分。
2.函数声明与函数定义
函数的声明是编译时的概念,是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。如果在函数调用前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数返回值类型默认为int 型。
函数原型和函数定义在返回类型、函数名和参数表上必须完全一致。如果它们不一致,虽然编译可能会通过,则在连接时就会发生“unresolved externel symbol”的错误
3.int *func(void)
关键字void表示的是没有参数而不是表示它有一个类型为void的参数。
4.c函数的所有参数的传递皆为“传值调用”,函数将获得参数值的一份拷贝,但是如果被调用的参数是一个数组名,数组并不会被复制,这时等价于指针的传递。在声明数组参数时不指定它的长度是合法的,因为函数并不为数组元素分配内存。
5.ADT(抽象数据类型),基本思想是:模块具有功能说明和接口说明,后者是面向用户的而前者是对用户隐藏的,这种隐藏是通过static关键字实现的。
6.阅读递归函数的方法不是纠缠于它的执行过程,而是相信递归函数会顺利完成它的任务。
7.可变参数
包含stdarg.h头文件
函数定义:
int func(int n1,...)
{
//定义一个va_list类型的变量,这个变量是指向参数的指针
va_list var_arg;
//用va_start宏初始化var_arg,这个宏的第二个参数是第一个可变参数前面一个
//参数的值,即是一个固定参数,这个宏执行后var_arg指向第一个可变参数
va_start(var_arg,n1);
//然后用va_arg返回可变的参数,将返回第一个可变参数的值(注意不是n1)
//并使var_arg指向下一个可变参数
int j = va_arg(var_arg,int);
//用va_end宏结束可变参数的获取,即使var_arg不再指向可变参数列表
va_send(var_arg);
}
可变参数必须从第一个到最后一个顺序访问。
阅读(660) | 评论(0) | 转发(0) |