C语言,day09

来源:互联网 发布:windows vista 镜像 编辑:程序博客网 时间:2024/06/06 00:27

数组可以作为形式参数使用
必须使用地址数据作为实际参数和数组形式参数配合使用
数组做形式参数的时候只是把形式参数写成数组的样子,真正的形式参数并不是数组
真正的形式参数是一个可以当作数组使用的变量

/*    数组形式参数演示*/#include <stdio.h>void print(int arr[5]) {    int num = 0;    for (num = 0;num <= 4;num++) {        printf("%d ", arr[num]);    }    printf("\n");}int main() {    int arr[] = {1, 2, 3, 4, 5};    print(arr);    return 0;}

数组形式参数里包含的所有存储区都不是被调用函数提供的
数组做形式参数可以让被调用函数使用其他函数提供的存储区
数组形式参数可以实现双向数据传递,具有这种特征的形式参数叫输入输出参数

/*    数组形式参数*/#include <stdio.h>void read(int arr[], int size) {    int num = 0;    printf("请输入%d个数字:", size);    for (num = 0;num <= size - 1;num++) {        scanf("%d", &arr[num]);    }}int main() {    int arr[3] = {0}, num = 0;    read(arr, 3);    for (num = 0;num <= 2;num++) {        printf("%d ", arr[num]);    }    printf("\n");    return 0;}

编写数组形式参数声明的时候可以省略数组里包含的存储区个数
使用数组做形式参数的时候需要提供一个整数类型形式参数表示数组形式参数里包含的存储区个数

/*    数组形式参数演示*/#include <stdio.h>#include <stdlib.h>#include <time.h>void create(int arr[], int size) {    int num = 0;    for (num = 0;num <= size - 1;num++) {        arr[num] = rand() % 36 + 1;    }}int main() {    int arr[7] = {0}, num = 0;    srand(time(0));    create(arr, 7);    for (num = 0;num <= 6;num++) {        printf("%d ", arr[num]);    }    printf("\n");    return 0;}

C语言里函数形式参数的个数可以不固定
这种参数叫变长参数
变长参数不能事先命名,需要使用特殊的方法才能获得实际参数的数值

/*    函数声明演示*/#include <stdio.h>int main() {    int num = add(3, 8);    printf("num是%d\n", num);    return 0;}double add(double num, double num1) {    return num + num1;}

如果编译器首先遇到函数调用语句就会猜测函数的格式,这个猜测结果叫函数的隐式声明。隐式声明中包含一个整数类型存储区用来存放返回值,可以有任意多个不确定类型的形式参数。
隐式声明中形式参数的类型或者是整数类型或者是双精度浮点类型
如果隐式声明和函数的实际格式不一致编译会出错
函数大括号前面的部分叫函数声明。可以把函数声明作为一条语句单独写在文件开头,这条语句里的形式参数名称可以省略。
这种做法叫函数的显式声明
显式声明可以避免编译器采用隐式声明
除了主函数以外的所有函数都应该显式声明

/*    exit标准函数演示*/#include <stdio.h>#include <stdlib.h>void print(void) {    printf("2\n");    //return ;    exit(0);    printf("3\n");}int main() {    printf("1\n");    print();    printf("4\n");    return 0;}

exit标准函数可以随时结束整个程序的执行
为了使用这个标准函数需要包含stdlib.h头文件
这个函数需要一个整数类型的实际参数,这个参数的作用和主函数返回值的作用一致

C语言中函数可以调用自己
这种函数叫递归函数

/*   递归函数演示*/#include <stdio.h>void print(void) {    printf("1\n");    print();}int main() {    print();    return 0;}

有些问题可以分解成几个小问题,至少一个小问题和原来的问题在本质上一样只不过稍微简单一点
具有这种特征的问题就适合采用递归函数解决

/*    递归函数演示*/#include <stdio.h>void print(int num) {    if (num == 1) {        printf("1 ");        return ;    }    print(num - 1);    printf("%d ", num);}int main() {    int num = 0;    printf("请输入一个整数:");    scanf("%d", &num);    print(num);    printf("\n");    return 0;}

递归函数编写步骤
1.用语句描述问题的分解方式(假设递归函数已经完成)
2.在递归函数开头编写分支处理不可分解的情况。这个分支必须可以让函数结束。

/*    递归练习*/#include <stdio.h>int sum(int num) {    if (num == 1) {        return 1;    }    return sum(num - 1) + num;}int main() {    int num = 0;    printf("请输入一个整数:");    scanf("%d", &num);    printf("求和结果是%d\n", sum(num));    return 0;}

用递归函数解决问题的思路叫递归
用循环解决同样问题的思路叫递推

/*    费氏数列练习*/#include <stdio.h>int fei(int num) {    if (num <= 1) {        return 1;    }    return fei(num - 2) + fei(num - 1);}int main() {    int num = 0;    printf("请输入一个编号:");    scanf("%d", &num);    printf("计算结果是%d\n", fei(num));    return 0;}

能使用某个变量的语句叫做这个变量的作用域
声明在函数内部的变量叫局部变量,局部变量的作用域包括函数内部的所有语句
声明在所有函数外边的变量叫全局变量,它的作用域包含程序中的所有语句
没有初始化的全局变量自动被初始化成0
全局变量和局部变量可以重名,这种变量名优先代表局部变量
能使用局部变量解决的问题就不要使用全局变量
存储区的使用不受作用域限制(可以跨函数使用存储区)
存储区的使用受到生命周期的限制
生命周期是一段时间,只有在生命周期的时间范围内才可以使用存储区
全局变量的生命周期是整个程序执行的时间范围
局部变量生命周期是函数一次执行的时间范围
如果函数多次运行则每次运行时局部变量对应的存储区都不同

/*    作用域演示*/#include <stdio.h>int num1;    //全局变量void func(void) {    int num = 2;    int num1 = 10;    printf("num是%d\n", num);    printf("num1是%d\n", num1);}int main() {    int num = 1;    printf("num是%d\n", num);    printf("num1是%d\n", num1);    func();    return 0;}

声明变量时可以使用static关键字,这种变量叫静态变量
全局变量和局部变量都可以是静态的
静态变量生命周期一定是整个程序执行时间
如果一个函数多次执行则每次静态局部变量对应的存储区都是同一个
如果一个函数结束了则它的静态局部变量存储区还可以给别的函数使用
没有初始化的静态变量会自动被初始化成0
静态变量的初始化只在程序开始的时候执行一次
静态全局变量的作用域只包含声明它的那个文件里的所有语句

/*    生命周期演示*/#include <stdio.h>void func(void) {    static int num = 6;    printf("num是%d\n", num);    num = 10;}void func1(void) {    int num = 100;    func();}int main() {    func();    func1();    return 0;}

指针变量用来记录地址数据
只有记录有效地址的指针变量才能使用
有效指针变量前使用*操作符可以找到另外一个变量

/*    指针变量演示*/#include <stdio.h>int main() {    int num = 0;    int *p_num = &num, *p_num1 = NULL;    //指针变量声明    p_num = &num;    *p_num = 10;    printf("num是%d\n", num);    return 0;}

指针声明语句中的类型名称表示指针应该记录哪种类型存储区的地址

可以在一条语句中声明多个同类型指针,这个时候必须在每个指针变量名称前单独写*

没有捆绑的指针分为两类
1.空指针里固定记录空地址(NULL),这个地址的数值就是0
2.所有其他没有捆绑的指针都叫野指针

程序员应该保证程序中不会出现野指针

指针变量必须初始化

指针变量初始化的时候*没有参与初始化过程

/*    费氏数列练习*/#include <stdio.h>//int arr[50];int fei(int num, int arr[], int size) {    //static int arr[50] = {0};    if (num <= 1) {        return 1;    }    if (!arr[num - 2]) {        arr[num - 2] = fei(num - 2, arr, size);    }    if (!arr[num - 1]) {        arr[num - 1] = fei(num - 1, arr, size);    }    return arr[num - 2] + arr[num - 1];}int main() {    int num = 0;    int arr[50] = {0};    printf("请输入一个编号:");    scanf("%d", &num);    printf("计算结果是%d\n", fei(num, arr, 50));    return 0;}
0 0
原创粉丝点击