假设主函数main()。其他函数void fun(int a,int *b)。
目前创新互联建站已为上千的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、遂宁网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
关于函数定义和声明:
在代码中fun函数,有完整函数体的代码就是函数定义部分,比如void fun(int a,int *b){。。。};。
如果没有具体实现的函数体代码(也就是大括号内容),那么就是函数声明。比如void fun(int ,int *);
关于函数声明和调用:
如果fun函数定义在main代码上面。比如:
void fun(int a,int *b){。。。};
int main(){
int a=0,int b=0;
......
fun(a,b);//这里fun定义代码在main上面,所以可以不需要声明。反之需要先写声明语句
return 0;
}
关于函数局部变量及全局变量:
简单区分:
定义在函数之外的就是全局变量,这个变量所有函数都可以直接使用,并且共用同一个地址。任意函数修改了变量值,其他函数调用也会变。
定义在函数之内的就是局部变量,局部变量只属于该函数,其他函数即使定义了同样名字的变量,这两个变量也不同地址,互不相干。
比如:
int a;//这就是全局变量,作用域下所有函数共用
int main()
{
int b;//这就是局部变量,只在本函数有效,如果想在调用fun函数时让fun也使用该变量,需要把这个变量的地址作为参数传递过去。
printf("%d",b);
return 0;
}
注意:c语言中允许局部变量和全局变量同名,但是同名的局部变量会屏蔽全局变量,实际代码避免同名。
关于函数传值和传址:
如函数void fun(int a,int *b){..........};这里形参a 和*b,分别表示一个值和一个地址
所以在调用该函数时,比如:
int main()
{
int c,d;
fun(c,d);//这里调用就对应上面形参类型,第一个参数传递了c的值(传值),第二个参数传递了d的地址(传址),这里c和d,叫做实参。当fun函数运行时改变了a和b指向地址的值,对应main函数中c的值不变,d的值改变。
return 0;
}
顺带一说:局部变量,在函数运行结束后会自动释放,所以想把局部变量地址作为返回值,需要用malloc函数申请。(这里看不懂可以暂时忽视)
左边这个 不仅定义在其前面主函数能用,其他定义在其前面的函数也能使用。
右边这个,只能定义在其前面的主函数能用,其他函数想用,不行。
也就是
#includestdio.h #includestdio.h
double fact(int n); //声明函数 int main(void){
int main(void){ double fact(int n); //声明函数
/* /*函数体*/
**** return 0;
*/ }
return 0;
}
void test() void test()
{ {
fact(2); //能用 fact(2); //不能用 未声明
} }
double fact(int n){ double fact(int n){
/* /*函数体*/
*函数体
*/ }
}
最好吧函数声明放在头文件的下面。不管用不用,值要用了调用函数就在头文件下声明下。不然你写调用函数嵌套很容易出现函数声明类型出错等问题的。
如果需要将函数定义放在函数调用后,可以采用函数声明。函数声明的格式为:返回值类型符 函数名称(形式参数列表);其中根据函数的不同,返回值类型可能是void(没有返回值),形式参数也可能是void(没有函数参数)。总之函数声明和函数定义部分的函数头格式基本相同,但函数声明在末尾有一个分号。函数声明里的形式参数可以只写类型而省略名称。函数声明可以位于主调函数的定义部分
函数声明也可以在函数外部,这样声明的特点是:当前文件从声明位置到文件结束的任何函数中都可以调用该函数。
函数定义和函数声明是完全不同的。函数定义包括函数头和函数体,完整的定义了函数的输入、输出和具体实现;函数定义一定包括一对大括号。而函数声明是为了编译的需要。总之只要理解了编译的特点,就比较容易理解声明的必要性和声明的有效范围。