(一)函数的声明与定义
函数的声明:声明函数的类型,但是不涉及实现函数的功能,没有函数体;(一般在主函数之前声明)
函数的定义:让函数实现某项功能,包括函数体;(函数体就是大括号里的内容)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include<stdio.h> /*常量的定义*/ #define NAME "mark" #define AGE 18 void star(); /*声明函数类型*/ int main(){ star(); printf( "%s\n" ,NAME); /*常用的转换说明符*/ printf( "%d\n" ,AGE); star(); return 0; } void star(){ int count; for (count=1;count<10;count++){ printf( "*" ); } printf( "\n" ); } |
(1)常量的定义
什么是常量?常量就是计算机内存中不变的数据;
定义常量的四种方式:字面常量,const定义的常量,#define定义的常量(符号常量),枚举常量;
字面常量:包括整形常量,字符型常量,字符串常量。注意:不存在数组常量,结构体常量等结构型的字面常量。如:int age =22中age是int变量,22是字面常量,不能被赋值。
const定义的常量:(可以使用const关键字把一个变量声明转换成常量声明,可以在函数体内使用)
const int MONTHS =12;
#define定义常量:(用标识符代表一个常量)
#define 标识符 常量
如:#define NAME "mark"
例如定义一个星期的枚举常量:enum Week {Mon,Tue,Wed,.....};
(2)声明函数类型
可不可以不声明函数类型,直接在主函数调用?(将子函数提前于主函数定义)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<stdio.h> /*常量的定义*/ #define NAME "mark" #define AGE 18 //void star();/*声明函数类型*/ void star(){ const int MONTHS =12; int count; for (count=1;count<10;count++){ printf( "*" ); } printf( "\n" ); } int main(){ star(); printf( "%s\n" ,NAME); /*常用的转换说明符*/ printf( "%d\n" ,AGE); star(); return 0; } |
程序报错,发现不能这样使用!
(3)常用的转换说明符
%c 一个字符;
%d 十进制的整数;
%f 浮点数;
%s 字符串;
%p 指针;
(二)函数的递归调用
(1)递归的定义:一个函数调用其本身,这种过程被叫作递归;
(2)递归的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include<stdio.h> void up_and_down(int n); /*函数的声明*/ int main(){ up_and_down(1); return 0; } void up_and_down(int n){ printf( "等级%d:地址%p\n" ,n,&n); if (n<4) up_and_down(n+1); printf( "等级%d:地址%p\n" ,n,&n); } |
运行结果:
分析:
如果把每个等级看成一个函数(如:等级1为fun1),则fun1执行完会调用fun2,fun2执行完会调用fun3,fun3执行完会调用fun4。fun4执行完由于没有满足if条件,则执行最后一行的fun4,fun4执行完,上一层的fun3才开始执行,fun3执行完,上一层的fun2开始执行,最后fun1执行完成。
如上图,最底层的函数被调用完,还需要完成后续未完成的代码!
(3)递归的特点:
1.每一级的函数都有自己的变量,每一级调用的n都不同,因此程序创建了4个独立变量;所以用递归算法实现的程序一般效率都不高,而且很耗内存;
2.程序调用结束后返回,不能一次性返回到初级调用,要逐级返回;如上述,fun4执行结束后,要返回到fun1的调用部分,只能从fun4到fun3,再从fun3到fun2,最后从fun2到fun1;
3.递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反;
4.虽然每一级递归有自己的变量,但是函数代码并不会得到复制;
(三)函数的形式参数和实际参数
形式参数:定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
实际参数:可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include<stdio.h> void swap(int x,int y);//形式参数 int main(){ int x=5,y=10;//实际参数 printf( "交换前:x=%d,y=%d\n" ,x,y); swap(x,y); printf( "交换后:x=%d,y=%d\n" ,x,y); return 0; } void swap(int x,int y){ int temp; temp=x; x=y; y=temp; printf( "交换中:x=%d,y=%d\n" ,x,y); } |
运行结果:
分析:
1.形式参数只在函数内部有效;
2.实际参数与形式参数之间用值传递的方式来传递数据;
3.形式参数的改变不影响实际参数;
ps:博主是新手,如果文章中有错误,敬请指正!文章内容参考C Primer Plus中文版!