自定义函数:
格式:函数类型 函数名(形式参数类型说明表)
{ 声明部分
执行部分
}
函数调用的形式:
(1)作为函数语句调用。函数一般无返回值。例: printf(“Hello,World!\n”);
(2)作为函数表达式调用。例: m=max(a,b)*2;
(3)作为函数参数调用。例: printf(“%d”,max(a,b)); m=max(a,max(b,c));
形参与实参:
形式参数:定义函数时函数名后面括号中的变量名
实际参数:调用函数时函数名后面括号中的表达式
例题:比较两个数并输出大者。
#include <stdio.h> void main() { int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("Max is %d",c); } int max(int x, int y) { int z; z=x>y?x:y; return(z); }
值传递方式方式: 函数调用时,为形参分配单元,并将实参的值复制到形参中; 调用结束,形参单元被释放,实参单元仍保留并维持原值。
地址传递方式: 函数调用时,将数据的存储地址作为参数传递给形参。
关于static的使用
函数中的局部变量的值在函数调用结束后不消失而保留原值,以便下一次调用该函数时可以使用上一次调用的最后结果。这时就应该指定该局部变量为“静态局部变量”。
#include <stdio.h> void increment(void); void main() { increment(); increment(); increment(); } void increment(void) { int x=0; x++; printf(“%d\n”,x); } 运行结果: 1 1 1
#include <stdio.h> void main() { void increment(void); increment(); increment(); increment(); } void increment(void) { static int x=0; x++; printf(“%d\n”,x); } 运行结果: 1 2 3
extern声明外部变量的使用:
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。
file1.c: static int A; main() { int power(int); int b=3,c,d,m; A=3; m=2; c=A*b; d=powe(m); }
file2.c: extern int A; power(int n) { int i,y=1; for(i=1;i<=n;i++) y*=A; return(y); }
此时file2.c中的A就无法使用了。
那么结合上一篇关于C语言中的数组问题,和这篇关于函数的内容,我们可以写出一个冒泡排序,来了解下函数运行的过程:
#include <stdio.h> void input(int a[], int length) { int i; printf("输入10个整数:\n"); for (i = 0;i < length; i++) { scanf("%d", &a[i]); } } void cmp(int a[], int length) { int j, i; int tmp; for(i = 0;i < length; i++) { for (j = 0; j < length - i -1; j++) { if (a[j+1] < a[j]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } } void output(int a[], int length) { int i; for(i = 0; i < length;i++) { printf("%d ",a[i]); } printf("\n"); } int main() { int a[10] = {0}; int length = sizeof(a) / sizeof(a[0]); input(a,length); cmp(a, length); output(a, length); return 0; }
函数运行的步骤:
一、通过函数名找到函数的入口地址。( input())。
二、给形参分配空间 (int a,int length)。
三、传值(把实参传给形参)(值传递、地址传递)(length->自定义函数的length)
四、执行函数体(main())
五、返回(return 0;)
★六、释放空间(exit(0))