函数
C 的函数本质是一个复合语句,用来执行一个语句序列。定义函数就像定义一个变量一样,需要声明返回值类型,标识符,然过()
来区分它是否为一个函数,跟上用{}
包裹的语句序列
返回值类型 标识符() {
// code...
return;
}
// 调用函数
标识符();
对于一个函数来说,必须主动调用才能够执行对应的语句序列
返回值
函数调用本身是一个表达式,可以使用return
关键字返回结果,返回类型必须符合定义函数时的数据类型,当执行到return
语句时,函数会立即结束执行并返回结果
int getValue() {
return 2333;
}
int main(void) {
getValue();
return 0;
}
如果返回值类型指定为void
,那么return
写不写都可以,为了规范,应该不写
参数
函数在定义的时候可以在()
定义参数,用来接受外部传入的数据,定义参数的函数叫有参函数,反之叫无参函数,有参函数相对于无参函数来说更加灵活,参数之间用,
分隔,
// 定义参数
int add(int a, int b){
return a + b;
}
int main(void) {
add(1, 2); // 传入参数
return 0;
}
定义在()
的变量叫形参,形参只在函数内部有效,当函数调用完毕时就会被销毁,通过调用传入的参数叫实参,参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生”类型不匹配”的错误
在参数的传递中,如果出现了将实不同的内存位置,那么参的值复制到了形参,两种参数存储在了就是按值传递
通过引用传递的实参和形参都会指向同一个内存位置,所做的任何改变都会反映到调用者的实参当中
原型
原则上函数定义必须在调用函数之前出现,如果在调用函数之前,编译器没有发现函数的定义则会抛出错误,这个问题可以通过定义函数的原型来解决,用来告诉编译器:这个函数我声明了,但是定义在后面
int add(int, int);
int sub(int, int);
int main(void){
add(1, 2);
sub(3, 2);
return 0;
}
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
警告
声明原型的时候参数名可以省,但是数据类型不能省
main() 定义问题
void main() {
// ...
}
main() {
// ...
}
这两种写法在大多数编译器下是没有错误的,但是非常不建议这么做。main
返回的int
是 C 向调用它的系统返回值一种方式,无论如何都要避免void main()
和main
写法,否则会被认为是无知的
另外,main
最好指定不带参数的情况,因为它明确的指定了main
只能在没有任何参数的情况下被调用,在大多数情况下它没有什么区别,但是它总是最推荐的做法
int main(void) {}
可变参数
C 支持可变参数,但是没有提供一些方法来识别传递参数的总数,但是可以额外使用一个参数来指定总数
void foo(int count, ...) {}
但是怎么访问这些参数呢?C 提供了一些解决变参问题的一些宏在头文件stdarg.h
#include <stdarg.h>
void foo(int count, ...) {
// 定义指向参数列表的指针
va_list ap;
// 初始化参数列表指针
va_start(ap, count);
// 访问参数,第二个参数是需要返回的类型,这个函数每调用一次,指针都会增加
va_arg(ap, int);
// 结束可变参数的获取
va_end(ap);
}