vlambda博客
学习文章列表

从0学起的C语言笔记(六、函数)

函数的概念

函数是 c 语言的功能单位,实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。

函数的分类

1. 从定义角度分类(即函数是谁实现的)

  1. 库函数 (c 库实现的)
  2. 自定义函数 (程序员自己实现的函数)
  3. 系统调用 (操作系统实现的函数)

2. 从参数角度分类

1. 有参函数

函数有形参,可以是一个,或者多个,参数的类型随便 完全取决于函数的功能

int fun(int a,float b,double c)
{
}

int max(int x,int y) {
}

2. 无参函数

函数没有参数,在形参列表的位置写个 void 或什么都不写 int fun(void) { } int fun() { }

3. 从返回值角度分类

(1) 带返回值的函数

在定义函数的时候,必须带着返回值类型,在函数体里,必须有 return 如果没有返回值类型,默认返回整型。例1:

char fun()//定义了一个返回字符数据的函数
{
    char b='a';
    return b; 
}

例2

fun() 
{
    return 1
}

如果把函数的返回值类型省略了,默认返回整型注:在定义函数的时候,函数的返回值类型,到底是什么类型的,取决于函数的功能。

(2).没返回值的函数

在定义函数的时候,函数名字前面加 void

void fun(形参表)
{
    ;
    ; 
    return   ; 
    ;
}

在函数里不需要 return 如果想结束函数,返回到被调用的地方,return ;什么都不返回就可以了

#include <stdio.h>
int max(int x,int y)
{
    int z;
    if(x>y)
        z=x; 
    else
         z=y;
    return z;
    }

void help(void)
{
    printf("*********************\n");
    printf("********帮助信息*****\n"); 
    printf("*********************\n");
    }

int main(int argc, char *argv[])
{
  int num;
  help();
  num = max(10,10+5);
  printf("num=%d\n",num);
  return 0;
}

函数的定义

什么叫做函数的定义? 即函数的实现函数的定义方法

返回值类型 函数名字(形参列表) 
{
    //函数体,函数的功能在函数体里实现
}
int max(int x, int y) {
       int z;
       if(x>y)
           z=x; 
       else
           z=y;
       return z;
}

注:形参必须带类型,而且以逗号分隔==函数的定义不能嵌套!!!== 即不能在一个函数体内定义另外一个函数, 所有的函数的定义是平行的。

void fun(void) {
    ; 
    ;
    ;
    void fun2(void)
        {
            ;
        }
}

这个程序是错误的,不能再 fun 的函数体中,定义 fun2 函数。

void fun(void)
{
    ; 
    ;
    ; 
}
void fun2(void)
{
    ;
}

这个程序是正确的,fun 和 fun2 是平行结构注:在一个程序中,函数只能定义一次给函数起名字的时候,尽量的见名知意,符合 c 语言的命名规则

函数的声明

概念 对已经定义的函数,进行说明 函数的声明可以声明多次。

为什么要声明

有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数, 因为编译器在编译 c 程序的时候,从上往下编译的。

什么时候需要声明

1. 主调函数和被调函数在同一个.c 文件中的时候

  1. 被调函数在上,主调函数在下 这种情况下不需要声明
void fun(void) {
    printf("hello world\n");
}
int main(){
    fun();
}
  1. 被调函数在下,主调函数在上 这种情况下需要声明 ==编译器从上往下编译,在 main 函数(主调函数),不认识 fun,需要声明==
void fun(void)
int main()
{
    fun(); 
}
void fun(void)
{
   printf("hello world\n");
}

2. 主调函数和被调函数不在同一个.c 文件中的时候 一定要声明

声明的方法:直接声明将被调用的函数的第一行拷贝过去,后面加分号,前面加 extern间接声明将函数的声明放在头文件中,.c 程序包含头文件即可

函数的调用

函数的调用方法

变量= 函数名(实参列表);   //带返回值的 
函数名(实参列表);             //不带返回值的

1. 有无返回值

1).有返回值的,根据返回值的类型,需要在主调函数中定义一个对应类型的变量,接返回值

int max(int x,int y)// x、y 形参,是个变量 
{

}
int main() 
{
    int num;      //需要定义一个 num 接收 max 函数的返回值
    num=max(4,8);   //4 和 8 就是实参 
}

2).没有返回值的函数,不需要接收返回值。

void fun(void) 
{
    printf("hello world\n");
}
int main() 
{
    fun(); 
}

2. 有无形参

函数名(实参列表);//带形参的 
函数名();//没有形参的

注意:实参,可以常量,可以是变量,或者是表达式 形参是变量,是被调函数的局部变量。

函数总结

在定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。使用函数的好处

  1. 定义一次,可以多次调用,减少代码的冗余度。
  2. 使代码模块化更好,方便调试程序,而且阅读方便

总结

非常感谢您能看到这里,下一次写变量的存储,局部变量,全局变量等内容

还找到一些小代码,大家有时间也可以尝试分析一下

#include "stdio.h"
//#include <windows.h>    //window用户需要的的库,使用时,删除前面的//
#include <stdlib.h>       //mac用户用户需要的的库

void printMap(char map[6][7] , int row, int col);
int main(int argc, const char * argv[])
{
    char map[7][7] = {
        {'#''#''#''#''#''#''#'}
        {'#''#''#'' ''#''#''#'},
        {'#'' '' '' ''#' ,' '' '},
        {'#''R''# ','#''#'' ''#'},
        {'#'' '' ''#''#'' ''#'},
        {'#''#'' '' '' '' ''#'},
        {'#''#''#''#''#''#''#'},
    };
    int row = sizeof(map)/sizeof(map[0]);
    int col = sizeof(map[0])/ sizeof(map[0][0]);
    printMap(map, row, col);
    int pRow = 2;
    int pCol = 1;
    int endRow = 1;
    int endCol = 6;
    while ('R' != map[endRow][endCol]) {
        printf("请输入相应的操作\n");
        printf("w(向上走) s(向下走) a(向左走) d(向右走)\n");
        char run;
        run = getchar();
        switch (run) {
            case 's':
                if ('#' != map[pRow + 1][pCol]) {
                    map[pRow][pCol] = ' ';
                    pRow++;//3
                    map[pRow][pCol] = 'R';
                }
                break;
            case 'w':
                if ('#' != map[pRow - 1][pCol]) {
                    map[pRow][pCol] = ' ';
                    pRow--;
                    map[pRow][pCol] = 'R';
                }
                break;
            case 'a':
                if ('#' != map[pRow][pCol - 1]) {
                    map[pRow][pCol] = ' ';
                    pCol--;
                    map[pRow][pCol] = 'R';
                }
                break;
            case 'd':
                if ('#' != map[pRow][pCol + 1]) {
                    map[pRow][pCol] = ' ';
                    pCol++;
                    map[pRow][pCol] = 'R';
                }
                break;
        }
        printMap(map, row, col);
    }
    printf("体验结束\n");
    printf("想挑战自己,请购买完整版本\n");
    return 0;
}
void printMap(char map[6][7] , int row, int col)
{
    system("clear");     //mac需要的清理控制台的函数
    //system("cls");     //windows需要的清理控制台的函数
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            printf("%c"map[i][j]);
        }
        printf("\n");
    }
}