1.函数就是功能,函数名字应反映其代表的功能。
2.一个C程序可由一个主函数和若干个其他函数构成。函数是可以调用的,但不能调用main函数。main函数是被操作系统调用的。
(一)定义函数的方法。
(1)定义无参函数的一般形式为:
类型名 函数名()
{
函数体
}
或
类型名 函数名(void)
{
函数体
}
函数体应包括声明部分和语句部分。
(2)定义有参函数
一般形式为
类型名 函数名 (形式参数表列)
{
函数体
}
函数体包括声明部分和语句部分。
(3)定义空函数
类型名 函数名()
{ }
例如:
void dummy()
{ }
(二)调用函数
print-star(); //调用无参函数
c=max(a,b);//调用有参函数
一般形式为:
函数名 (实参列表)
如果是调用无参函数,则实参列表可以没有,但括号不能省略。
函数参数
函数调用作为另一个函数调用时的参数。例如:m=max(a,max(b,c))
调用函数并不一定要求包括分号(如 print_star();)
(三)实参和形参
在定义函数时函数名后面括号中的变量名称为“形式参数”。
在主调函数中调用一个函数时,函数后面括号中的参数称为“实际参数”,实际参数可以是常量,变量,表达式。
(1)在调用函数的过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。
(2)实参与形参的类型应相同或赋值兼容。
(3)调用结束,形参单元被释放。注意:实参单元应保留并维持原值,没有改变。
(4)实参想形参的数据传递为值传递,单向传递,只能由实参传给形参。实参和形参在内存中占有不同的储存单元,实参无法得到形参的值。
(四) 对被调用函数的声明和函数原型。
(1)在函数声明中的形参名可以省写,而只写形参的类型类型。
float add(float x,float y) 可以写成 float add(float,float);
(2)1.函数类型 函数名(参数类型 1 参数名1,参数类型2 参数名2,... ,参数类型n,参数名 n);
2.函数类型 函数名 (参数类型1,参数类型2,参数类型3,...,参数类型n)
(五)函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。(c语言的特点之一)
例如:
int f(int x)
{
int y,z;
z=f(y);
return (2*z);
}
汉诺塔问题。
#include
int main()
{
void hanoi(int n,char one,char two,char three);
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to move %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y);
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y)
{
printf("%c->%c\n",x,y);
}
(六)数组作为函数参数
1.数组元素可以用做函数实参,不能用做形参。在用数组元素做函数实参时,把实参的值传给形参,是值传递方式。
数据传递的方向是从实参传到形参,单向传递。
2.数组名作函数参数
用数组元素做实参时,向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址
。
3.多维数组名作函数参数
int array[3][10];
或 int array[][10];
c语言自定义函数实参和形参 C语言 函数的定义 调用函数 实参和形参 函数的声明和函数原型 递归...