1.函数中调用函数还有声明函数的差别是前面是否加上函数类型(函数类型也就是返回值类型)
2.函数根据能否被其它源文件调用可以分成两个类型
-
可以被外部源文件调用的函数被称为外部函数(extern),格式为:
extern double funll(int x,int y) -
不能被外部源文件调用的函数被成为内部函数(static),格式为:
static double funll(int x,int y)
如果调用函数与被调用函数不在同一个源文件中,应该用这两个格式进行声明
3.当形参(形式参数)为变量的时候,使用传值方式实现形式参数与实际参数的数据传递。
传值方式只能单向传递数据,从实际参数传向形式参数,但形式参数没办法传个实际参数。所以即使当实际参数传递数据给形式参数后,形式参数改变了,实际参数也不会有改变,但我们想要的恰恰就是将形式参数的数据传给实际参数
例:
#include<stdio.h>
void jun(int a,int b)
{
int c;
scanf("c=%d",&c);
a=a+c;
b=b+c;
getchar();
}
void main(void)
{
int x=2,y=3;
jun(x,y);
printf("%d %d",x,y);
getchar();
getchar();
}
上面这个程序想要jun函数实现两个实数的数据交换,但两个形参均为普通变量,以传值方式传递数据,形参的变动不会影响实参的数据。所以不管输入的值为多少,x、y的输出值都不会改变
注:要解决这个问题可以定义一个全局变量或者使用return函数来实现两个函数之间的数据交换
当形式参数为数组或指针的时候,使用传址方式实现数据传递
传址方式为双向传递,两者实现共享数据,当一方改变,另一方也会发生改变。
当传递数组时,调用函数中的参数只需写下数组名(即该数组的首地址)当作指针变量来除理,且为一维数组,也不用写下第一维的大小
例:
#define N 5
main()
{
int sum(int a[ ],int n); //形参作指针变量,第一维的大小无需指定
int s,n=10;
int score[n];
s=sum(score,N); //调用函数,只需写数组名
}
int sum(int a[ ],int n) //同上,第一维的大小无需指定,且定义函数不用分号
注:在该程序中,程序的本质为使用score数组进行计算,而不是作为形参变量的数组a
4.函数定义的变量中,优先级表现为:
语句块局部变量>函数级局部变量>全局变量
注:为了便于识别,全局变量的第一个字母最好使用大写
传址方式和传值方式的区别和本质
传值方式其实只是函数在处理数组的时候,必须分配足够的内存来存储数组的副本,函数所处理的数组也只是副本,不是原始数据;而传址方式却是把数组的地址传给函数,让函数直接处理数组
易错点
1.当应该函数调用另一个函数作为实际参数的时候,不能在被调用的函数前加上函数类型,因为你是要调用这个函数,而不是声明函数