C语言数组作为函数参数及保护数组内容

来源:互联网 发布:仿5173源码 php 编辑:程序博客网 时间:2024/06/09 17:46

    C语言函数的参数传递主要有两种,一种为值传递,可以了理解为传递了一个副本,传递之后副本无论如何改变均不会影响到原来的变量,安全性高,但是子函数只能通过return来实现与原函数的通信;另一种为地址传递,包括数组名作为函数参量和指针变量作为函数参量

    注:其实编译器会把数组名作为指针变量进行处理,只是数组名是个指针常量,不能改变数组名的值,如ar【】,ar是一个数组名,则不能使用ar++这样的表达式,因为ar++会改变ar的值,编译器是不允许的!我这里只是点到即止,为了说明数组名与指针变量之间有很大的联系,具体可以参看相关C语言教材

    函数的地址传递方式为程序提供了很大的灵活性,但是存在着用户可能会不经意修改了一些数据的可能。从ANSI C开始,提供了const关键字来保护数组内容,可以在函数声明和函数定义中加入const关键字,若函数中出现了对该数组的意外修改则会报错,另外这样使用const关键字是不要求原始数组是固定不变的,只是用于要求该子函数的动作不能改变我的数组参数的内容,达到数据保护的目的。

    这里我提供了一个实用性较强的例子:老师输入同学成绩,然后程序显示出同学们的成绩,并给出评定报告,报告内容包括:最高分,最高分人数,90分以上人数,不及格人数以及平均分。由于输入成绩之后我不希望这个成绩被程序意外修改了,所以在子函数中采用const关键字进行保护,另外我希望评定报告的程序能用一个子函数来实现,但是需要返回这么多结果,显然采用return语句无法实现,所以采用数组来进行实现,具体代码如下:

/*============================================================== # Author:      Joker@HIT    NolanRobot@163.com # Filetype:    C source code # Environment: Linux & Ubuntu 14.04 # Tool:        Vim & Gcc # Date:        Tue Aug 23 2016  # Descprition: Input the class grade, then give the assessment!===============================================================*/#include<stdio.h>#include<stdlib.h>#include<time.h>#define SIZE 50#define TERM 5//highest grade; the number of highest; the number of up_90; the number of failed; averagevoid print_grade(const int [], int);void assessment(int [], const int [], int, int);int main(void){int grade[SIZE];int analyze[TERM];int i;srand((unsigned int)time(NULL));for(i=0;i<SIZE;i++)grade[i] = rand() % 100 + 1;printf("The grade of students as follow:\n");print_grade(grade, SIZE);assessment(analyze, grade, TERM, SIZE);printf("The highest score is %d, with %d students\n"       "The number of higher than 90 is %d\n"       "The number of failed is %d\n"   "The average score is %d\n",    analyze[0], analyze[1], analyze[2], analyze[3], analyze[4]);return 0;}void print_grade(const int array[SIZE], int size){int i;for(i=0;i<size;i++){printf("%-5d", array[i]);if((i+1)%10==0)putchar('\n');}return;}void assessment(int value[TERM], const int array[SIZE], int term, int size){int i;for(i=0;i<term;i++)value[i] = 0;for(i=0;i<SIZE;i++){value[4] += array[i];if(value[0]<array[i])value[0] = array[i];if(array[i]>=90)value[2]++;if(array[i]<60)value[3]++;}value[4] = value[4] * 1.0 / SIZE;for(i=0;i<SIZE;i++)if(array[i]==value[0])value[1]++;return;}

代码中采用了随机数函数生成50位同学的成绩,结果如下:

由于随机数生成,所以挂科率和平均分有点低,哈哈哈哈!


若是对程序有什么修改意见,或其他问题,欢迎留言或者邮箱交流!

0 0