函数头:返回类型+函数名+形参声明
·形参声明——用于接收辅助性提示的变量
函数调用函数体:
·仅在函数中的变量——注意不能声明和形参同名的变量,否则会发生变量名冲突的错误
//输出较大的整数 #includeint max2(int a,int b) { if(a>b) return a; else return b; } int main() { int n1,n2; printf("请输入两个数:n"); scanf("%d%d",&n1,&n2); printf("较大的数是:%d",max2(n1,n2)); return 0; }
printf("较大的数是:%d",max2(n1,n2));
·其中max2后的 括号()称为——函数调用运算符
·()括起来的n1 ,n2——实参
·被函数调用的一方,会生成用于形参的变量,并赋予其实参的值,这种情况下a,b会被赋予n1和n2的值,即45,83
·函数返回的是表达式的值,不能返回两个以上的值
·函数间参数的传递是通过值传递进行的
函数设计 1⃣️没有返回值的函数
#includevoid put_stars(int n) { while(n-->0) putchar('*'); } int main() { int i,len; printf("打印一个直角在左下方的等腰直角三角形n"); printf("短边:n"); scanf("%d",&len); for(i=0;i<=len;i++) { put_stars(i); putchar('n'); } return 0; }
2⃣️ 不含形参的函数此函数只是用来显示的,因此没有需要返回的结果
对于这类没有返回值的函数——声明用void
·逆向显示输入的正整数算法
#includeint scan_print(void) { int tmp; do{ printf("请输入一个正整数"); scanf("%d",&tmp); if(tmp<=0) printf("请输入正整数"); }while(tmp<=0); return tmp; } int rev_int(int num) { int tmp=0; if(num>0){ do{ tmp=tmp*10+num%10; num /= 10; }while(num>0); } return tmp; } int main() { int nx=scan_print(); printf("该整数倒转后的值时%dn",rev_int(nx)); return 0; }
scan_print 读取键盘输入的正整数并返回
该函数不接收形参,在小括号内写入了void
·注意: int main(void) 表示main函数中不包含形参
·作用域int nx=scan_print();//变量使用函数的返回值进行初始化
这种初始化方法只适用于拥有自动存储期的对象,不适用于拥有静态存储期的对象
块作用域:变量的名称从变量声明的位置开始,到包含该声明的程序块最后的大括号}为止这一区间内通用
int rev_int(int num) { int tmp=0; if(num>0){ do{ tmp=tmp*10+num%10; num /= 10; }while(num>0); } return tmp; }例如例子的 tmp 变量
文件作用域:在函数外声明的变量标识符,其名称从声明的位置开始,到该程序的结尾都是通用的
⬇️例中的数组tensu被赋予了文件作用域,因此在main函数和top函数中无需特意声明,可以直接使用#include函数定义#define NUMBER 5 //学生人数为5 int tensu[NUMBER];//创建数组实体的声明 int top(void);//top函数的原型声明 int main() { extern int tensu[];//数组的声明,可以省略 int i; printf("请输入%d名学生的分数n",NUMBER); for(i=0;i max) max=tensu[i]; } return max; } #define NUMBER 5 //学生人数为5
int tensu[NUMBER];//创建了一个变量实体:元素为5,元素类型为int的数组tensu
声明extern int tensu[]; //没有真正创建出变量的实体——非定义声明
函数原型声明:编译器在读取数据时,也是从头到尾顺序依次读取(中top函数定义在main函数后面,所以想在main函数中调用top函数,编译器需要提前知道)
int top(void);//明确了 函数的返回类型,形参类型和个数等的声明--函数原型声明
注意该声明以;结尾
对比:
int top(void){.....}----定义声明
int top(void); ----非定义声明
头文件——库函数的函数原型声明使用#include 指令,就可以将
中的全部内容读取到程序中
数组的传递
#include接收数组的形参声明:#define NUMBER 5 int max_of(int v[],int n);//非定义声明 int main() { int i; int eng[NUMBER];// english score int mat[NUMBER];// maths score int max_e , max_mat ; // highest score printf("请输入%d名学生的分数。n",NUMBER); for(i=0;i max) max=v[i]; } return max; } 类型名参数名 []
int max_of(int v[],int n)
这里使用形参n来接收元素个数
max_e=max_of(eng,NUMBER); ----> v[0]代表eng[0]的内容
max_mat=max_of(mat,NUMBER);
调用函数时使用的实参,只要写明数组的名称就可以了
const类型修饰符
·被调用函数中作为形参收到的数组==函数调用时被作为实参的数组
️止在函数内修改已接收到的数组内容的方法——在声明形参的时候加上const类型修饰符
#includevoid set_zero(int v[], int n); void print_array(const int v[], int n); int main() { int a,b; int arr1[]={1,2,3,4,5,6,7,8,9}; int arr2[]={2,3,4,1,4,2,1,4,5}; printf("arr1= "); print_array(arr1,9); putchar('n'); printf("arr2= "); print_array(arr2,5); putchar('n'); set_zero(arr1,5);//把0赋给arr1的前5个元素 set_zero(arr2,8);//把0赋给arr2的前8个元素 printf("赋值0过后的元素如下n"); printf("arr1= "); print_array(arr1,9); putchar('n'); printf("arr2= "); print_array(arr2,9); putchar('n'); return 0; } void print_array(const int v[], int n)//声明不改变所接收的数组的元素的值 { int i; printf("{"); for(i=0;i



