函数
在C中,子程序的作用由函数来完成。一个程序由一个主函数和若干个其他函数构成。
主函数调用其他函数,其他函数也可以互相调用
用途:1.提高代码复用性 好处:便于分别编写,分别编译
2.功能分解 提高调试效率
函数:主调函数(实参)。功能或服务的使用方式称为主调函数
被调函数(形参)。功能或服务的提供方式称为被调函数
方向:实参——形参( 单向传递 ) 实参和形参的类型应相同
传递方式:值传递,指针传递 C++:有引用传递
在调用函数时,给形参分配存储单元,并将实参对应的值传给形参,调用结束是,形参的值发生改变,实参单元仍旧保持原值。
调用函数的条件:调用函数必须是已经存在的(是库函数或用户自己定义的)
如果使用库函数,需将有关于#include包含在本文件中
使用自己定义的函数,应先函数声明
函数可以被嵌套调用,但是不可以嵌套调用
数组作为函数参数:形式上是一个数组名,但本质上是一个指针变量。通过形参数组名是无法获取数组大小的。
X86:sizeof(形参数组名)==4 B
X64:sizeof(形参数组名)==8 B
所以数组名作为函数参数时一般回家一个参数表名数组长度,通过形参数组名对数组元素的修改,会改变实参元素的值。
形参数组名与实参数组名类型名应严格一致。
用数组名做函数参数,应该在主调函数和被调函数分别定义数组。
函数分类:
c函数库自带的函数
— 主函数–
void main() // 主函数
— -数学函数 在math.h–
float sin(float x) //求正弦函数
float abs(float x) //求绝对值函数
----文件型函数 —
void feof(FILE *p) //是否文件末尾函数
void rewind(FILE *p) //文件定首位函数
int ftell(FILE *p)//文件指针位置函数
FILE fopen( “文件名称”,“文件打开方式”) //打开文件函数
flose(FILE *p) //文件关闭函数
fsanf(FILE *P,“格式字符串”,类型 类型名称) //格式化读函数 将数据从文件中读取到类型名称中
void fprintf(FILE *p,“格式字符串”,类型 类型名称) //格式化写函数 将数据从出入框中读取到文件中
void fputc(FILE *p, 类型 类型名称) //将字符串写到文件中
char fgetc(FILE *p) // 将数据从文件中写到字符中
–字符函数—
void putchar(char c)//将字符串输入到控制台上
char getchar()//字符写函数
–输入输出函数–
printf(“格式输出字符串”,类型参数名);
scanf(“格式输入字符串”,类型参数名地址);
—空间函数–
类型 *malloc(sizeof(类型)) //申请空间函数
类型 *calloc(1,sizeof(类型))//申请空间函数
free(类型) //释放空间函数
自定义函数
局部变量和全局变量
局部变量:从定义开始,到其所在的程序块结束而结束
全局变量:标示符声明在前,使用在后。未被赋初值,默认为0,。从定义开始,到
程序结束。作用:增加了函数间数据联系的渠道。
变量的存储类别:
动态存储方式:普通局部变量,函数形参
静态存储方式:全局变量,静态局部变量
auto变量:不专门声明static存储类别,都为动态的·分配在存储空间中
static声明局部变量:函数再次运行依旧能保留上一次运行的值,未初始化,默认值为0
举例:
int n=1;
main()
{ static int x=5;int y;y=n;
printf(“MAIN:x=%2d y=%2d n=%2d\n”, x,y,n)//5,1,1;
func();//6,21,11
printf(“MAIN:x=%2d y=%2d n=%2d\n”,x,y,n);//8,31,21
func();//8,31,21
}
func( )
{ static int x=4;
int y=10;
x=x+2;
n=n+10;
y=y+n;
printf(“FUNC:x=%2d y=%2d n=%2d\n”,x,y,n);}
main()
{increment();
increment();
increment();
}
increment()
{ int x=0;
x+=1;
printf(“%d”,x);
}//111
这两个代码,一个是有静态变量static,继续按所得的是为上一次所计算得到的。
后一个,每次计算,x都被重新初始化,为(auto int——int)
extern声明外部变量:将文件中的全局变量扩展到文件中;在文件写:
extern 类型名 全局变量名