5、函数的调用
1)传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
#include <stdio.h>
//如果是闰年,返回1;不是闰年返回0。
int is_leap_year(int x)
{
if (((0 == x % 4) && (0 != x % 100)) || (0 == x % 400))
return 1;
else
return 0;
}
int main()
{
int a = 0;
printf("请输入年份:\n");
scanf("%d", &a); //输入年份
if (1 == is_leap_year(a)) //判断是否为闰年
{
printf("%d 是闰年!\n", a);
}
else
{
printf("%d 不是闰年!\n",a);
}
return 0;
}
这里将输入的a的数值传给函数 is_leap_year() 即可计算并返回判断值。但外界的a数值并不会改变。
2)传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
#include <stdio.h>
//调用后num加1。
int add_num(int* x)
{
(*x)++;
}
int main()
{
int num = 0;
int a = 0;
while (1)
{
printf("输入0停止计数,请输入:");
scanf("%d", &a);
if (a) //如果a不为0,则执行程序。
{
add_num(&num); //num加1。
printf("计数加1。\n");
printf("%d\n", num); //打印结果递增,第一次1,第二次2,....
}
else
{
printf("结束计数\n"); //如果a为0,则直接结束循环。
break;
}
}
return 0;
}
每次输入非0数值后,打印结果加1,即num的值被修改了。
6、函数的嵌套调用和链式访问
1)函数的嵌套调用
一个函数可以调用另一个函数。
#include <stdio.h>
//打印一个字
int nest1(int x)
{
printf("嵌"); //打印嵌。
return 0;
}
//调用nest1,并打印第二个字
int nest(int x)
{
nest1(1); //调用函数 nest1。
printf("套"); //打印套。
return 0;
}
int main()
{
int a = 0;
nest(a); //执行结果,打印 嵌套 。
return 0;
}
函数 nest1() 的作用是打印“嵌”;函数 nest() 的作用是调用一次 nest1() 再打印“套”;最后执行一次函数nest(),得到的结果是打印 “嵌套” 。
2)函数的链式访问
把一个函数的返回值作为另外一个函数的参数。
#include <stdio.h>
//返回1。
int link()
{
return 1; //返回1。
}
//输入值加1,然后返回这个结果
int add(int x)
{
x++; //X加1。
return x;
}
int main()
{
printf("%d\n", add(link())); //打印结果是2。即 link返回的1,在add()里面直接+1提供给printf打印。
return 0;
}
add() 函数的参数是函数 link(),而不是变量。
7、函数的声明和定义
函数声明
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体存不存在,无关紧要。
函数的声明一般出现在函数的使用之前。要满足先声明后使用。
函数的声明一般要放在头文件中。
头文件为 xxx.h格式,在头文件中声明函数,在头文件对应的 xxx.C文件中编写程序,即可在主函数中使用#include "xxx"进行调用。
头文件方式引用,在交易代码时可以通过静态库方式保护自己代码。
#include <stdio.h>
#pragma comment(lib,"add.lib")
#include "add.h"
int main()
{
int num = 0;
int a = 0;
while (1)
{
printf("输入0停止计数,请输入:");
scanf("%d", &a);
if (a) //如果a不为0,则执行程序。
{
add_num(&num); //num加1。
printf("计数加1。\n");
printf("%d\n", num); //打印结果递增,第一次1,第二次2,....
}
else
{
printf("结束计数\n"); //如果a为0,则直接结束循环。
break;
}
}
return 0;
}
头文件 add.h 引用时用 “” ,注意与库函数区分。使用静态库的情况下,还需要 #pragma comment(lib,"add,lib"),引用静态库。
//调用后num加1。
int add_num(int* x);
头文件 add.h 中的内容只是声明,并没有具体的代码。
//调用后num加1。
int add_num(int* x)
{
(*x)++;
}
头文件对应的 add.c 中才是代码。
此处大概介绍头文件,感兴趣的还需查找详细资料。