(上期练习第4题)(4).写一个函数,每调用一次这个函数,就会将num的值增加1:
(第一种方法:使用指针变量)
//写一个函数,每调用一次这个函数,就会将num的值增加1: //改变了实参的值,要使用地址变量 #include <stdio.h> void test(int* p) { (*p)++; // (复习)*:说明p是指针变量 // 此时 *p 去取num的地址,所以相当于num } int main() { int num = 0; test(&num); // 调用一次test()这个函数,将num的值增加1 test(&num); // 函数参数为变量地址,用于在函数中改变实参的值 printf("%d\n", num); return 0; }
(第二种方法:使用return返回值)
//写一个函数,每调用一次这个函数,就会将num的值增加1:2 #include <stdio.h> int test(int n) { return (n + 1); } int main() { int num = 0; num = test(num); num = test(num); printf("%d\n", num); return 0; }
(该方式较啰嗦,使用num传值又使用num被赋值)
6.函数的嵌套调用和链式访问:
函数和函数之间是可以根据实际的需求进行组合的,也就是互相调用。
6.1 嵌套调用:在函数定义中调用别的已声明定义函数
(各种函数类似各种零件,把各种函数嵌套调用,就像把各种零件相互组装)
[注意:可以嵌套调用,但是不能嵌套定义(在函数定义中声明定义并使用别的函数)]
6.2 链式访问:把一个函数的返回值作为另外一个函数的参数
//链式访问 #include <stdio.h> #include <string.h> int main() { printf("%zd\n", strlen("abcdef")); return 0; }
(帮助理解案例:)
//链式访问(“4321”) #include <stdio.h> int main() { // printf()函数的返回值是 字符串的个数 (重点) printf("%d", printf("%d", printf("%d", 43))); return 0; }
(“多打印一个空格后”:)
//链式访问(“4321”+ 空格) #include <stdio.h> int main() { // printf()函数的返回值是 字符串的个数 (重点) printf("%d ", printf("%d ", printf("%d ", 43))); return 0; }
7.函数的声明和定义(用途广泛):
7.1 函数声明:
(1).告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在(可能只声明了但未定义),函数声明决定不了。
(2).函数的声明一般出现在函数的使用之前。要满足先声明后使用。
(补充:声明时形参也可以不写,只写参数类型和个数即可)
//函数声明:告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。 //但是具体是不是存在(可能只声明了但未定义),函数声明决定不了。 #include <stdio.h> //函数声明: //函数的声明一般出现在函数的使用之前。要满足先声明后使用。 int Add(int x, int y); int main() { int a = 0; int b = 0; //输入 scanf("%d %d", &a, &b); //加法函数: int c = Add(a, b);//函数调用 //打印 printf("%d\n", c); return 0; } //函数的定义: int Add(int x, int y) { return x + y; }
(像上图这种情况,函数定义在主函数下面,这时如果主函数上面没有该函数的声明,运行时系统会报警告)
(3).函数的声明一般要放在头文件里。(分模块编程)
//add.h: //函数的 声明 放在头文件中 int Add(int x, int y); //add.c: //函数 定义 放在对应的c文件里 int Add(int x, int y) { return x + y; } // 主程序: //分模块去编程,方便协作,最后做整合 //可以把代码的实现和声明分离 #include <stdio.h> #include "add.h" // 调用对应的头文件, //相当于对相应的函数进行了声明 int main() { int a = 0; int b = 0; //输入 scanf("%d %d", &a, &b); //加法函数: int c = Add(a, b); //其它源文件内定义的函数具有 外部连接属性 , //可直接调用 ,(之前staic讲过) //打印 printf("%d\n", c); return 0; }
(4).设置静态库:(代码保密)
(设置完后,执行程序,会生成一个对应的.lib文件,是一个二进制文件,包含函数定义的内容,文件点开后显示的是乱码。进行交易时可以提供给买家 .lib文件 和 .h头文件,头文件告诉有什么函数和函数怎么使用,买家只知道怎么使用里面的函数,但不知道具体是怎么实现的。)
(5).导入静态库:
// .lib - 静态库 // 导入静态库:(假设静态库名称为"add.lib") #pragma comment(lib, "add.lib")
7.2 函数定义:
(1).函数的定义是指函数的具体实现,交待函数的功能实现。
(2).函数定义也是一种特殊的声明。(把函数定义写在主函数之前)
#include <stdio.h> //函数的定义: int Add(int x, int y) { return x + y; } int main() { int a = 0; int b = 0; //输入 scanf("%d %d", &a, &b); //加法函数: int c = Add(a, b);//函数调用 //打印 printf("%d\n", c); return 0; }