C语言零基础入门—函数-03
本节课的任务是:
- 函数的声明。
- 全局变量与局部变量。
01 - 函数的声明
前面我们说过,自定义的函数,必须放在 main 函数前面,这是为什么呢?
- 答:因为C程序在执行之前,会先被编译器(比如:VC6.0)将每一个函数划分为一块一块的函数块,并且由上向下的顺序分配函数块的地址,于是进行函数调用的时候 主函数(假设是函数 a) 根据 被调用函数(假设是函数 b) 的地址去找到 被调用函数(b),如果我们把被调用函数(b)放在主函数(a)下面的话,先被分配地址的就是主函数(a),当地址分配到主函数(a)里边的被调用函数(b)的时候,被调用函数(b)还未被分配地址,于是报错。是不是云里雾里的,没看懂没关系,看下边的图,我在讲解一遍:
- 如图,编译器给这三个函数分配地址的顺序是:
- 先分配b的地址。
- 再分配a的地址。分配a的时候,运行到 调用b函数的代码的时候,就可以直接把b的地址放在这个代码之上就可以了。(如果运行到这里的时候b还未分配地址,也即b是在a下边分配地址,则这里就会找不到b的地址,报错)
- 最后分配main函数的地址。分配main的时候,运行到 调用函数a的代码的时候,就可以直接把a的地址放在这个代码之上就可以了。(如果运行到这里的时候a还未分配地址,也即a是在main下边分配地址,则这里就会找不到a的地址,报错)
于是,函数的定义是应该具有先后顺序的。
01.1 - 函数的声明。
有这么一种方式,我们可以使用函数的声明式定义来定义函数,这样就可以把自定义函数写在main的后边了。
- 函数的声明就是:在main函数前面,先指出函数的存在,具体的函数位置可以随便写。
例子:
错误演示:
#include<stdio.h>
void main(){
Dayin();
}
void Dayin(){
printf("函数调用了。\n");
}
这里会报错,error C2065: 'Dayin' : undeclared identifier
也就是Dayin函数找不到。
正确的演示:
#include<stdio.h>
void Dayin();
void main(){
Dayin();
}
void Dayin(){
printf("函数调用了。\n");
}
这样就正常了,我们在main之前先把函数给定义了出来,这样程序编译的时候,会先给自定义函数分配地址,main中调用的时候也能找到函数的地址。
01.2 - 函数的声明语法
其实声明语法很简单的,他是直接把一个函数直到 {
符号之前的所有内容复制一下,末尾加一个 ;
放在main之前即可。
例子:
一个自定义函数是这样的:
int fun(int a,char b){
函数体...
}
那么他的函数定义就是:
int fun(int a,char b);
02 - 全局变量与局部变量
02.1 - 全局变量
所谓的全局变量就是我们所有函数中都可以使用的一个变量,通常他是用来指定一些不会再变化的内容。
比如我们定义double pi = 3.14
,将他作为数学中的Π。
全局变量的最好的定义位置是在 #include ...
的后边。
例子:
#include<stdio.h>
double pi = 3.14;
// 求周长函数
void L(double r){
double L = 2 * pi * r;
printf("圆的周长是:%f \n",L);
}
// 求面积函数
void A(double r){
double S = pi * r * r;
printf("圆的面积是:%f \n",S);
}
void main(){
double r = 3.0;
L(3);
A(3);
}
这里的 pi 就是一个全局变量,我们在所有的函数中可以直接使用他。
全局变量不做过多的延申,基本用到的情形也就是一些全局常量的定义而已。
02.2 - 局部变量
局部变量也就是这个变量只属于某一个函数,某一个循环等等,在这个范围之外在调用,就是错误的。
其实我们之前所讲到的变量,几乎全都是局部变量。
例子如下:
正确的例子:
#include<stdio.h>
void main(){
int a = 1;
for(int i=0 ; i<5 ; i++){
printf("%d ",a);
printf("%d \n",i);
}
}
错误的例子:
void print(){
// 这里的 a 找不到。
printf("%d \n",a);
}
void main(){
int a = 1;
for(int i=0 ; i<5 ; i++){
printf("%d ",a);
printf("%d \n",i);
}
// 这里的 i 找不到。
printf("%d \n",i);
}
a这个变量属于函数main的局部变量,我们在main函数之内可以使用。但是到了main之外就不能使用变量a,除非再从新定义。
i这个变量属于for循环的局部变量,我们在for循环之内可以使用,但是在for循环之外就不可以使用了,除非再从新定义。
03 - 结束
函数的基础知识算是结束了,下一节准备找一些函数的习题来练习。