课程名称:物联网/嵌入式工程师
章节名称:第4周之第三讲 1-1 至 1-6 C语言中的指针:指针和二维数组、数组指针和二维数组
讲师姓名:大白老师
C语言强调模块化
编程,这里所说的模块就是函数,即把每一个独立的功能均抽象为一个函数来实现。从一定意义上讲,C 语言就是由一系列函数串组成的。
我们之前把所有代码都写在 main 函数中,这样虽然程序的功能正常实现,但显得杂乱无章,代码可读性、可维护性较差。学完本节之后,应把每个具体的独立功能单位均抽象为一个函数,在 main 函数中调用各个函数。
函数是一系列C语言语句的集合,为了完成某个可能会重复使用的功能,而封装起来的代码。
设计的好处: 实现模块化的编程思想,提高程序的可读性。
函数设计要求: 见名知意
返回值类型 函数名(类型 参数1,类型 参数2….); // 函数的声明 int main() { 函数名(参数1,参数2,参数3); // 函数的调用 return 0; } 返回值类型 函数名(类型 参数1,类型 参数2….) // 函数的定义 { C语言代码; return 数据; }
#include <stdio.h> void printf_star(); // 函数的声明 //* //** //*** int main() // 程序的入口,程序开始的地方 { int k = 0; for(k = 1;k <= 3;k++) { printf_star();// 函数的调用 } return 0; } // void 表示返回空 void printf_star() // 函数的定义 { int i = 0,j = 0; for(i = 1;i <= 3;i++)// i代表行数 { for(j = 1;j <= i;j++) // j代表每行答应的星星个数 { printf("*"); } printf("\n"); } return ; }
返回值类型 函数名(类型 参数1,类型 参数2….) // 函数的定义 { C语言代码; return 数据; } int main() { 函数名(参数1,参数2,参数3); // 函数的调用 return 0; }
#include <stdio.h> //void 表示返回空 void printf_star() // 函数的定义 { int i = 0,j = 0; int k = 0; for(i = 1;i <= 3;i++)// i代表行数 { for(j = 1;j <= i;j++) // j代表每行答应的星星个数 { putchar('*'); } putchar('\n'); } return ; } //* //** //*** int main() // 程序的入口,程序开始的地方 { int k = 0; for(k = 1;k <= 3;k++) { printf_star();// 函数的调用 } return 0; }
1.设计一个void do_sum()函数,要求函数内部无参数和返回值,内部定义一个变量int m, 要求用户从键盘输入一个数据赋值给m。 判断m的值,若是m为奇数,输出1 + 3 + 5 + 7 + 9 +...+m的和. 若是m为偶数,输出0 + 2 + 4 + 6 + 8 +...+m的和. 2.设计一个void do_Result()函数,要求函数内部定义int a,b两个变量, 然后从键盘输入2个整数赋值给a,b,并输出(a + b) / 2的值。
#include <stdio.h> // void do_sum() { int i,m,ret,result = 0; printf("请输入一个数据:\n"); ret = scanf("%d",&m); if (ret != 1) { while (getchar() != '\n'); printf("请输入数字!"); do_sum(); } i = m & 1 ? 1 : 0; for (; i <= m; i+=2) { result += i; i != m ? printf("%d + ",i) : printf("%d",i); } printf(" = %d\n",result); return; } // void do_Result() { int a,b,ret; printf("请输入两个2个字符数据:\n"); scanf("%d",&a); scanf("%d",&b); ret = (a + b) / 2; printf("(%d + %d) / 2 = %d\n",a,b,ret); return; } int main() { do_sum(); do_Result(); return 0; }
全局变量 : 在函数外部定义的变量,我们叫做全局变量. 特点: (1) 在本文件中的任何函数中都可以使用。-----作用域 (2) 在定义变量的时候,系统会申请内存空间,当main()函数结束的时候, 系统会回收全局变量对应的内存空间. -----生命周期 (3) 全局变量未初始化,值默认为0
局部变量 : 在函数内部定义的变量,我们叫做局部变量。 特点: (1) 只能在定义它的那个函数内部使用,其他位置不能使用。----作用域 (2) 调用函数时,运行在定义变量代码的时候,系统会申请内存空间, 当定义该变量的函数调用结束后, 系统会回收局部变量对应的内存空间. -----生命周期 (3) 局部变量未初始化,值默认为随机值。
#include <stdio.h> int global = 20; //全局变量 void do_global() { global ++; printf("global = %d\n",global); return ; } void do_local() { int t = 10; //局部变量 t++; printf("t = %d\n",t); //1 return ; } int main() { do_global(); do_global(); do_global(); printf("======================\n"); global++; printf("g = %d\n",global); do_local(); do_local(); do_local(); return 0; }
静态局部变量 格式: static 数据类型 变量名; static int c; 特点: (1)静态局部变量,可以改变原来变量的生命周期,当定义该变量的函数调用结束后, 系统不会回收对应的内存空间,当main()函数结束后, 内存空间才会被回收. (2)只能在定义它的那个函数内部使用,其他位置不能使用。----作用域 (3)静态局部变量未初始化,值默认为0
#include <stdio.h> void do_local() { // 只定义一次,可以使用多次 static int t = 10;// 局部变量 t++; printf("t = %d\n",t); } int main() { do_local(); do_local(); do_local(); return 0; }
定义全局变量 global_data = 0; 设计无参数的函数global_calc(),在这个函数内部 要求用户从键盘输入一个数据赋值给global_data,然后要求 该函数输出,从1~global_data之间所有能被7整除的数据。 main函数来调用以下global_data这个函数。
#include <stdio.h> // void do_sum() { int i,m,ret,result = 0; printf("请输入一个数据:\n"); ret = scanf("%d",&m); if (ret != 1) { while (getchar() != '\n'); printf("请输入数字!"); do_sum(); } i = m & 1 ? 1 : 0; for (; i <= m; i+=2) { result += i; i != m ? printf("%d + ",i) : printf("%d",i); } printf(" = %d\n",result); return; } // void do_Result() { int a,b,ret; printf("请输入两个2个字符数据:\n"); scanf("%d",&a); scanf("%d",&b); ret = (a + b) / 2; printf("(%d + %d) / 2 = %d\n",a,b,ret); return; } int main() { do_sum(); do_Result(); return 0; }
通过对变量属性的学习,能够熟练的写出一些函数。