1、函数的定义
函数的定义就是函数体的实现.
语法:
类型
函数名(形式参数)
代码块
函数返回类型和函数名分开写是代码风格的问题,现代语言如swift返回值在函数名和参数表的后面,这样使得某些工程工具追踪源代码时更容易查找函数名.
K&RC 的旧式声明:
int *
find_int(key, array, array_len)
int key;
int array[];
int array_len;
{
}
为了兼容一些旧的编译器,C标准保留了这种声明格式
2、函数的声明
2.1 函数原型 (function prototype)
函数原型用于向编译器提供函数信息.格式上就是函数定义的起始部分+分号.
2.2 函数的缺省认定
当程序调用一个无法见到原型的函数时,编译器便认为该函数返回一个整型值.
3、函数的参数
C函数的所有参数均以“传值调用”方式进行传递,这意味着函数将获得参数值的一份拷贝.这样函数可以放心的修改这个值,而不必担心会修该调用程序实际传递给它的参数.
有个例外,如果被传递的参数是一个数组名,并且在函数中使用下标引用该数组的参数,那么在函数中对数组元素进行修改实际上修改的是调用程序中的数组元素.函数将访问调用程序的数组元素,数组并不会被复制,这就是“传址调用”
但是,实际上,传递数组做为参数时是传递的指针的一个拷贝.从这个角度考虑,C函数的所有参数均以传值调用.
传值点用的一个例子:
/**
对值进行奇偶校验
@param value 整型参数值
@param n_bits 数值的有效位数
@return 1 : 偶数个 0 : 奇数个
*/
int
even_parity(int value, int n_bits){
int parity = 0;
//计数值中值为1的位的个数
while (n_bits > 0) {
parity += value & 1;
value >>= 1;
n_bits -= 1;
}
//如果计数器的最低位是0,返回TRUE,表示1的位数为偶数个
return (parity % 2) == 0;
}
//交换调用程序中的两个整数值(无效),因为它实际交换的是参数的拷贝
void
swapX(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
//传递指向希望修改的变量的指针,
void
swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
//调用时
swap (&a, &b);//要传递指针