007-函数-C语言笔记

/ 0

函数的分类

C 程序是由一个一个的函数组成的,函数在其他一些编程语言里也叫方法。

函数可以分为三大类:

1.主函数,每个程序中有且只能有一个、也必须有一个主函数。无论主函数写在什么位置,C 程序总是从主函数开始执行的,并且只执行 main 函数,其他函数都是需要在 main 函数中调用的。

2.程序员自定义函数,就是由我们自己写的函数,可以写任意个,不限制。

3.C 语言提供的库函数,比如 printfscanf 函数等等。

函数的声明定义和调用

函数的作用:

1.实现代码的复用,将1段代码放在函数之中,什么时候想要执行这段代码,我们只需要调用这个函数就可以了,减少代码的冗余。

2.修改和维护十分的方便,只要修改函数体的代码,所有在调用函数的地方都会跟着一起改。

3.屏蔽代码的实现,对于函数的调用者而言,不需要关心函数的内部是如何实现的,只需要关心函数实现什么功能。

声明语法:

返回值类型 函数名称([参数列表]);

定义语法:

返回值类型 函数名称([参数列表]){
    那段需要被重用的代码;
    函数体;
}

调用语法:

函数名称([参数列表]);//如果没有返回值

例如:

#include <stdio.h>

//定义一个打印99乘法表的函数
void show99Biao(){
    for(int i = 1; i <= 9; i++){
        for(int j = 1; j <= i; j++){
            printf("%d * %d = %d\t",j,i,i*j);
        }
        printf("\n");
    }
}

int main(int argc, const char * argv[]){
    //调用函数
    show99Biao();
    return 0;
}

函数名也就是函数的标识符,和我们变量一样,要遵守标识符命名规范。一般我们为函数命名都是以小字母开头,如果多个单词就第一个单词首字母小写,后面的每个单词首字母大写。

函数的形参和实参

函数的参数:声明在定义函数的小括弧之中的变量,就叫做函数的参数,我们可以理解为参数是在函数里定义的一个局部变量,所以我们不能在函数之中再声明1个和参数名相同的局部变量,是会冲突的。

参数如何使用:因为参数也就是函数里定义的一个局部变量,所以我们可以在函数体内使用参数。当我们调用1个函数的时候,如果这个这个函数带了参数,这个时候要求在调用这个函数的时候要为这个函数的参数赋值。

形式参数:定义在函数的小括弧之中的参数,我们叫做形式参数, 简称形参。

实际参数:在调用函数的时候,实际上为形参赋的值,就叫做实际参数,简称实参。

在调用带参数的函数的时候,要求调用的时候必须要为形参赋值,并且实参的类型最好是要和形参的类型一致,如果不一致,会做类型转换。

例如:

#include <stdio.h>

//带单个参数的函数
void panDuanOuShu(int num){
    if(num % 2 == 0){
        printf("是偶数\n");
    }else{
        printf("不是偶数\n");
    }
}

void getSum(int num1,int num2){//带多个参数的函数
    int sum = num1 + num2;
    printf("sum = %d\n",sum);
}

int main(int argc, const char * argv[]){
    panDuanRunNian(1998);//调用panDuanOuShu函数,打印出:是偶数
    getSum(10,100);//调用getSum函数,打印出:sum = 110
    return 0;
}

带返回值的函数

return 关键字可以用在函数之中,如果在函数之中遇到了 return 关键字,就会立即结束这个函数的执行,如果return后面还有函数体代码是不会被执行的了,而是立即结束这个函数。

break、continue、return的区别

break用在switch-case之中,代表立即结束switch-case结构。用在循环体之中,代表立即结束当前循环结构。

continue只能使用在循环体之中,代表立即结束本次循环。

return用在函数体之中,代表结束函数。

什么时候函数需要返回值?

当函数执行完毕之后,有1个结果(数据),函数内部不确定如何处理这个数据。并且这个数据调用者需要的,调用者自己想要按照自己的方式来处理这个结果。那么这个时候,函数就应该将这个数据返回给调用者,由调用者自己来决定如何处理这个数据。

函数如何将数据返回给调用者呢?

  1. 先确定函数内部要返回给调用者的数据的类型。

  2. 修改函数的返回值类型为要返回的数据的类型。

  3. 在函数结束之前,使用 return 关键字将数据返回。

调用者如何拿到函数返回来的数据呢?

定义1个和函数的返回值类型相同的变量接收就可以。

例如:

#include <stdio.h>

int isRunNian(int year){
    if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
        return 1;
    }
    return 0;
}

int main(int argc, const char * argv[]){
    //用户接收返回的数据并进行处理
    if(isRunNian(2016) != 0 ){
        printf("哈哈.终于可以过生日了.");
    }else{
        printf("哎....");
    }

    return 0;
}

全局变量和局部变量

局部变量:定义在函数内部的变量,叫做局部变量。

全局变量:定义在函数外部的变量,叫做全局变量。

相同点:都是变量,都会在内存中申请空间,用来存储数据。

作用域不同:

局部变量可以在函数的内部从定义这个局部变量开始,到这个作用域结束的这段期间都可以访问。定义在1个函数中的变量,在另外1个函数绝对是不能访问,因为它属于不同的作用域。

全局变量从定义全局变量出开始,后面的所有的函数都可以访问这个全局变量,定义在全局变量前面的函数是无法访问这个全局变量的。但是一般情况下,我们全局变量的声明都是放在所有的函数的前面的。

默认值不同:

我们声明1个局部变量,如果没有为这个局部变量赋值,那么这个局部变量中的值是垃圾值。

如果我们声明1个全局变量,没有为这个全局变量赋值,那么这个全局变量的默认值为被自动初始化为0。

回收时间不同:

当定义局部变量的大括弧被执行完毕之后,这个局部变量就会被系统立即回收。

全局变量在程序结束的时候,才会回收。

例如:

#include <stdio.h>

int quanJv = 100;

void test1(){
    quanJv++;
}

int main(int argc, const char * argv[]){
    printf("quanJV = %d\n",quanJv);//打印quanJV = 101
    int quanJv = 200;
    printf("quanJV = %d\n",quanJv);//打印quanJV = 200
    return 0;
}