【C语言】数组形参

来源:互联网 发布:同步教育软件 编辑:程序博客网 时间:2024/05/18 12:02

1、数组可以作为形式参数使用

2、数组做形式参数的时候真正的形式参数并不是数组而是一个可以作为数组使用的变量

3、数组形式参数里包含的存储区都不是被调用函数提供的

4、声明数组形式参数的时候可以省略中括号里的整数

5、使用数组形式参数的时候必须配合一个整数类型的形式参数,这个参数用来表示数组里的存储区个数

6、数组形式参数可以让被调用函数使用其他函数的存储区

7、调用函数和被调用函数都可以自由使用数组形式参数里的存储区,所以数组形式参数可以实现双向数据传递,具有这种特征的形式参数叫输入输出参数

/* * 数组形参演示 * */#include <stdio.h>#include <stdlib.h>#include <time.h>void print(int arr[],int size) { //定义一个数组的形参,arr[]方括号里的数字可以写可以不写,随意写都可以,因为这里的数组是之前早已创建好了的,不是被调函数提供的存储去,但是这里必须配合一个整数类型的参数来做大小    int num = 0;    for(num = 0; num <= size -1; num++) {        printf("%d \n", arr[num]);    }}void neg(int arr[], int size) {    int num = 0;    for(num = 0; num <= size -1; num++) {        arr[num] = 0 - arr[num];    } }/* * 产生张彩票,用函数来实现,彩票张数由用户决定 * */void cp(int p[],int num) {    printf("num:%d\n",num);    int cnt = 0, i = 0, c = 0;//    srand(time(0));    do {        c = rand() % 36 + 1;     //   printf("c:%d", c);        for(i = 0; i <= cnt - 1; i++) {            if(p[i] == c) {                break;            }        }//        printf("p:%d cnt:%d \n", p[cnt], cnt);        if(i == cnt) {            p[cnt] = c;            cnt++;        }    }while(cnt < num);}int add(int num, int num1)     return num + num1;}int main() { // int arr[] = {1, 2, 3, 4, 5}; // print(arr,5); //   neg(arr,5);//   srand(time(0));//写在主函数中//   int num = 0;//   printf("请输入需要多少张彩票:\n");//   scanf("%d", &num);//   int p[num];//   cp(p,num);//   int i = 0;//   printf("产生的彩票是:\n");//   for(i = 0; i <= num - 1; i++) {//         printf("%d ", p[i]);//   }//   printf("\n");    int num = 0;     printf("%d", add(3,8));    return 0;}

8、C语言里函数参数的个数可以不固定,这种参数叫做变长参数

9、不能在编写函数的时候给变长参数命名,在被调用函数里可以通过特殊的方法获得没有命名参数的内容

10、如果编译器首先遇到函数调用语句就会猜测函数的格式。计算机认为函数有一个整数类型的存储区用来存放返回值,函数可以接受任意多个不确定类型的参数。

11、这个猜测结果叫做函数的隐式声明

12、隐式声明里参数的类型只能是整数类型或双精度浮点类型

13、如果函数的真实格式和隐式声明格式不同则编译的时候就会出错

14、可以把函数大括号前面的部分单独写成一条语句,这种语句叫做函数声明语句

15、把函数声明语句放在文件开头叫做显式函数声明

16、函数的显示声明可以避免隐式声明的发生

/* * 函数声名 * */#include <stdio.h>int add(int, int); // 可以省略括号里面的行参名字;这个语句的作用就是让程序知道函数是什么类型的,知道类型后才可以创建存储区int main() {    printf("num+num1=%d\n", add(3, 9));    return 0;}int add(int num, int num1) {    return num + num1;    }

17、函数声明语句里可以省略形式参数的名称

18、除了主函数以外的所有函数都应该显示声明

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

/** 终止函数exit**/#include <stdio.h>#include <stdlib.h>void func() {    printf("2\n");    exit(0);  //会结束掉后面的程序,跟reture 0效果一样    printf("3\n");}int main() {    printf("1\n");    func();    printf("2\n");    return 0;}

20、C语言里函数可以调用自己,这种函数叫做递归函数

21、如果一个问题可以拆分成多个小问题,至少一个小问题和原来的问题在本质上一样但是稍微简单一点。这种问题就适合采用递归函数解决。

22、递归函数编写步骤

  • 1.编写语句解决分解后的每个小问题(这个时候要假设递归函数已经完成,可以使用)
    2.在递归函数开头编写分支解决不可分解的情况(这个分支必须可以让函数结束)

23、使用递归函数解决问题的方法叫递归

24、使用循环解决类似问题的方法叫递推

24、检验递归函数的时候先用最简单的参数检验,然后逐渐把参数变复杂继续检验。如果所有参数的检验都能成功就说明递归函数编写正确。

/* * 递归函数和递推函数 * */#include <stdio.h>/* * 递归方法求阶乘 * 编写的时候先把小一项的写出来,即jc_dg(num_jcdg-1) * 然后让本身和小一项相乘 * 然后在上面将不可再化简的项写处,并列出最后的返回值 * */int jc_dg(int num_jcdg) {    if(num_jcdg == 1) {        return 1;    }    return (jc_dg(num_jcdg - 1) * num_jcdg);}/* * 递推方法求阶乘 * */int jc_dt(int num_jcdt) {    int i = 0;    int fac = 1;    for(i = 1; i <= num_jcdt; i++) {        fac *= i;    }    return fac;}/* * 递归实现汉诺塔 * */int hnt(int n, char a, char b, char c) {    if(n == 1)         printf("\t%c->%c\n", a, c);    else {        hnt(n-1, a, c, b);        printf("\t%c->%c\n", a, c);        hnt(n-1, b, a, c);    }}int main() {//    int num = 0;//    printf("请输入一个整数:\n");//    scanf("%d", &num);//    printf("jc_dg:%d的阶乘是:%d\n", num, jc_dg(num));//    printf("jc_dt:%d的阶乘是:%d\n", num, jc_dt(num));    int n = 0;   printf("请输入要移动的块数:\n");    scanf("%d",&n);    hnt(n,'a','b','c');}
/* * 递归函数 * */ * #include <stdio.h>void print() {    printf("1\n");    print();}void print_1(int num) {    if(num == 1)        printf("1");    return;     print(num - 1);    printf("num:", num);}/* * 用递归方法,输入一个数,然后累加 * */int exercise_1(int num) {   // static int sum;//用此方法必须注意加static   // sum = sum + num;    if(num == 1) {  //处理不可分解的事情     //   sum = sum + num;  //不能写在里面,写在里面相当于前n-1次就没有进入这个运算,只最后一次算了一下      return 1;    }    else {        return (exercise_1(num-1) + num);    }}int main() {//    print();//    print_1(10);    int num = 0;    printf("请输入一个整数:\n");    scanf("%d", &num);    printf("%d\n", exercise_1(num));    return 0;}
原创粉丝点击