zoukankan      html  css  js  c++  java
  • 【学习笔记】【C语言】函数

    一、 什么是函数

    任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”。所以,你可以说C语言程序是由函数构成的。

    比如你用C语言编写了一个MP3播放器程序,那么它的程序结构如下图所示:

    clip_image002

    二、 函数的定义

    1. 定义函数的目的

    将一个常用的功能封装起来,方便以后调用

    2. 定义函数的步骤

    函数名:函数叫什么名字

    函数体:函数是干啥的,里面包含了什么代码

    3. 格式

    固定格式(很多语言的函数都是这么写的)

    返回值类型 函数名(形式参数列表)

    {

    函数体

    }

    举例

    定义一个函数,计算两个整数的和

    sum(int a, int b)

    {

    int c = a + b;

    }

    三、 函数调用

    sum(10, 11); 引出返回值

    说明函数的调用过程

    简述return的作用

    四、 函数的参数

    1. 形参和实参的基本概念

    2. 形参个数和实参一致:sum(10, 11, 12)

    3. 参数的传递是值传递

    4. 参数名不能跟函数内的局部变量同名

    5. 函数可以没有参数:设计一个函数返回PI

    五、 函数的返回值

    1. 返回值的基本概念、return的作用

    2. void

    3. return

    void可以省略return

    可以多次使用return

    return后面不能有其他语句

    4. 函数的弱语法

    如果没有写返回值类型,默认是int

    如果写了返回值,可以不返回

    调用一个没有定义过的函数

    六、 定义函数的步骤

    1. 明确函数作用,起一个有意义的函数名称

    2. 明确函数的参数和返回值

    3. 举例:

    求两个整数的和

    打印一条横线

    打印N条横线

    七、 函数注意

    不能嵌套定义函数

    死循环调用,自己调用自己

    不能重复定义、可以重复声明

    八、 函数的补充

    1. main函数

    返回值:0,正常退出;1,异常退出

    2. printf函数

    #include

    返回值:字符串的长度

    九、 函数的声明

    1. 函数的定义顺序

    2. 函数的声明作用:声明和定义,类似于身份证和人的关系,编译买机票、链接登机

    clip_image004

    3. 只有函数声明、没有定义,编译警告、链接报错

    十、 .h文件和.c文件的分工

    1. 单文件的坏处

    一个文件的内容太多,不利于阅读、调试

    多人修改同一个文件出问题

    公司里面是团队合作

    2. 将sum函数抽取到另一个.c文件中

    先直接调用sum函数,编译警告、链接main.c错误

    #include “sum.c” , 编译链接main.c,运行成功(画图分析.o文件中的东西)

    如果avr.c中使用sum.c,编译链接main.c,运行程序(画图分析出错原因)

    3. 在其他文件中声明sum函数

    int sum(int,int);

    编译链接main.c

    编译链接sum.c

    编译链接main.c sum.c,运行成功

    avr.c利用一样的方法

    4. 将int sum(int,int)抽取到另外一个文件中

    不抽取声明的坏处:增加新的函数了

    抽取到.c文件中?开发工具会将所有的.c进行编译链接

    抽取到.h文件中

    5. 抽取步骤总结

    .c文件写函数的定义

    .h文件写函数的声明

    要想用我的函数,请包含我的.h文件

    好处分析

    十一、 代码

    1.

     1 #include <stdio.h>
     2 
     3 /*
     4  1.什么情况下定义函数:添加一个常用的新功能
     5  
     6  2.函数的定义格式
     7  返回值类型  函数名(形式参数列表)
     8  {
     9     函数体
    10  }
    11  
    12  3.定义函数需要明确的东西
    13  1> 起一个有意义的函数名
    14  2> 
    15  */
    16 
    17 int printLine()
    18 {
    19     printf("-------------
    ");
    20     return 0;
    21 }
    22 
    23 int average(int num1, int num2)
    24 {
    25     return (num1 + num2)/2;
    26 }
    27 
    28 int main()
    29 {
    30     /*
    31     printLine();
    32     
    33     printLine();
    34     
    35     printLine();
    36      */
    37     
    38     int a = 10;
    39     int b = 9;
    40     
    41     int c = average(a, b);
    42     
    43     printf("c is %d
    ", c);
    44     
    45     int a1 = 11;
    46     int b1 = 20;
    47     
    48     int d = average(a1, b1);
    49     printf("d is %d
    ", d);
    50     
    51     return 0;
    52 }

    2.

     1 #include <stdio.h>
     2 /*
     3  参数注意点
     4  1.形式参数:定义函数时函数名后面中的参数,简称形参
     5  2.实际参数:调用函数式传入的具体数据,简称实参
     6  3.实参个数必须等于形参个数
     7  4.函数体内部不能定义和形参一样的变量
     8  5.如果是基本数据类型作为函数形参,纯粹是值传递,修改函数内部形参的值,并不会影响外面实参的值
     9  6.一个函数可以没有形参,也可以有无限多个形参
    10  */
    11 
    12 // 形式参数,简称形参
    13 int sum(int num1, int num2)
    14 {
    15     // 函数体内部不能定义和形参一样的变量
    16     // int num1;
    17 
    18     num1 = 50;
    19 
    20     return num1 + num2;
    21 }
    22 
    23 /*
    24  return的作用:
    25  1> 退出函数
    26  2> 返回一个具体值给函数调用者
    27  
    28  返回值注意点
    29  1> void代表没有返回值
    30  2> 如果没有明确说明返回值类型,默认是返回int类型
    31  3> 就算明确声明了返回值类型,也可以不返回任何值
    32  
    33  默认情况下,C语言不允许两个函数的名称一样
    34  */
    35 
    36 char test()
    37 {
    38     return 'A';
    39 }
    40 
    41 /*
    42 void test(int a, int b)
    43 {
    44 
    45 }*/
    46 
    47 void test5()
    48 {
    49     
    50 }
    51 
    52 /* 伪代码
    53 void login(QQ, 密码)
    54 {
    55     // 1.验证QQ有没有值
    56     if (QQ没有值) return;
    57     
    58     // 2.验证密码有没有值
    59     if (密码没有值) return;
    60     
    61     // 3.把QQ、密码发送到服务器
    62     
    63 }*/
    64 
    65 int test3()
    66 {
    67     printf("999999999
    ");
    68 }
    69 
    70 // 如果不明确声明返回值类型,默认就是int类型
    71 test2()
    72 {
    73     printf("888888888
    ");
    74     return 10;
    75 }
    76 
    77 int main()
    78 {
    79     int c = test2();
    80     printf("c=%d
    ", c);
    81     
    82     test3();
    83     //test();
    84     
    85     /*
    86     int a = 100;
    87     int b = 27;
    88     
    89     // a、b称为函数的实际参数,简称实参
    90     int c = sum(a, b);
    91     
    92     
    93     printf("a=%d, b=%d, c=%d
    ", a, b, c);*/
    94 
    95     return 0;
    96 }

    3.函数练习

     1 /*
     2     求两个整数的差
     3     打印一条横线
     4     打印N条横线
     5  
     6  定义函数的步骤
     7  1> 根据函数的作用,起一个有意义的名称
     8  2> 确定函数的形参个数
     9  3> 确定函数的返回值
    10  */
    11 #include <stdio.h>
    12 
    13 void printLines(int n)
    14 {
    15     for (int i = 0; i<n; i++)
    16     {
    17         printf("-------------------
    ");
    18     }
    19 }
    20 
    21 void printLine()
    22 {
    23     printf("-------------------
    ");
    24 }
    25 
    26 int minus(int a, int b)
    27 {
    28     return a - b;
    29 }
    30 
    31 int main()
    32 {
    33     printLines(10);
    34     //printLine();
    35     //printf("%d
    ", minus(100, 29));
    36     
    37     return 0;
    38 }

    4.函数注意点

     1 #include <stdio.h>
     2 /*
     3  1.默认情况下,不允许有函数的名称一样
     4  2.函数不能嵌套定义
     5  3.函数不能重复定义,但是可以重复声明
     6  4.如果有函数的声明,没有函数的定义
     7  1> 编译可以通过,因为编译器只会检测语法合不合理,并不会检测函数有没有定义
     8  2> 链接报错,因为链接的时候会检测函数是否定义
     9  
    10  */
    11 
    12 // 函数的声明
    13 //void printLine();
    14 //void printLine();
    15 //void printLine();
    16 //void printLine();
    17 //void printLine();
    18 //void printLine();
    19 
    20 int main()
    21 {
    22     void printLine();
    23     
    24     printLine();
    25     return 0;
    26 }
    27 
    28 // 函数的定义
    29 
    30 void printLine()
    31 {
    32     printf("--------
    ");
    33 }
  • 相关阅读:
    Socket的使用
    TCP/IP协议、UDP协议、 Http协议
    使用或不使用递归的二分查找
    冒泡排序、选择排序、直接插入排序
    Scanner的使用 猜数字 +猜电影
    序列化与反序列化
    构造者模式
    内存访问
    实践:使用socket实现跨进程通信(二:多并发)(C语言)
    实践:使用socket实现跨进程通信(C语言)
  • 原文地址:https://www.cnblogs.com/dssf/p/4578970.html
Copyright © 2011-2022 走看看