@[toc]
目录
先来看一段代码。要求:创建一个在一行打印10个-的函数,并使用它。
#include<stdio.h>
#define width 15
void lel (void) ;//函数原型
int main()
{
lel();//函数调用
printf("他的名字是Jack.\n");
lel();
return 0;
}
void lel (void)//定义函数
{
int i;
for(i=0;i<width;i++)
printf("-");
printf("\n");
}
/*运行结果
---------------
他的名字是Jack.
---------------*/
# 函数原型
1.()表明lel是一个函数。
2.第一个void是函数类型,void类型表明函数没有返回值。第二个void表明函数不带参数。
3. ;表明这是在声明函数,不是定义函数。
4.函数原型(声明),告诉编译器在别处查找函数的定义。函数原型也可放在main()里面或其他位置,在首次调用该函数之前的位置都可以。
#函数调用
当计算机执行到lel();语句时会找到函数定义并执行其内容,执行完lel()中的内容后,计算机会返回main()执行下一条语句。
再来看一段代码。要求:创建一个在一行打印一定数量-的函数,使用函数参数传递-的数量。
#include <stdio.h>
void lel (char ch,int i);
int main()
{
lel('-',10);
printf("\n");
printf("He is Jack.\n");
lel('-',16);
printf("\n");
return 0;
}
void lel(char ch,int i)
{
int j;
for(j=0;j<i;j++)
{
printf("%c",ch);
}
} /*运行结果:----------
He is Jack.
----------------
*/
#函数的定义
1.函数的定义形式
//函数头
#include <stdio.h> //预处理指令
#define width15 //预处理指令
void lel (void) //函数名
//函数体
{
int i; //声明
for(i=0;i<width;i++) //循环语句
printf("-"); //函数表达式语句
printf("\n"); //函数表达式语句
}
(1)函数头中的lel()后面没有分号,让编译器明白这是定义lel(),而不是调用函数或声明函数原型。
(2)lel()函数中的变量i是局部变量,该变量只属于lel()函数。在程序中其他地方使用该变量,不会引起名称冲突,它们是同名的不同变量。
#带形式参数的函数
#定义
void lel (char ch,int i)//ANSI C风格函数头
告诉编译器lel()使用两个参数ch和i,ch是char类型,i是int类型。
i 和ch这两个变量被称为形式参数,形式参数也是局部变量,只属于lel()。每次调用函数,就会给这样的变量赋值。
ANSI C(美国国家标准协会及国际标准化组织推出的关于C语言的标准)要求在每个变量前都声明其类型。
void lek (int a,b)//无效函数头
void lek(int a,int b)//有效函数头
ANSI C之前的形式(ANSI C也接受,但在逐渐淘汰):
void lel (ch,i)//圆括号中只有参数名)
char ch;//在函数左花括号之前声明
int i;
void lex (a,b,c)
int a,b,c;//变量是同一类型,可用逗号分隔变量名
#声明
void lel (char ch,int i); //ANSI C形式
可省略变量名 :
void lel (char,int);//在原型中使用变量名并没有实际创建变量,仅表示一个##类型的变量
ANSI C也接受过去声明函数的形式:
void lel ();//圆括号中没有参数列表
#调用
实际参数是出现在函数调用圆括号中的表达式,形式参数是函数定义的函数头中声明的变量。
实际参数,提供ch和i的值。
lel ('a',10);//实际参数是a和12,这两个值被赋给lel()中相应的形式参数char和int
形式参数是被调函数(lel())中的变量,实际参数是主调函数(main())赋给被调函数的具体值。
实际参数可以是常量,变量或表达式,实际参数最终被求得的值(实际参数是具体的值)要被拷贝给被调函数相应的形式参数。
无论被调函数对拷贝函数进行什么操作,都不会影响主调函数中的原始数据。
C语言中的一切函数调用中,实参传递给形参的机理都是“按值传递”。如果要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。
#局部变量,全局变量
局部变量:作用在一定区域内,才能被使用的变量,出了自己的作用域就会被释放掉。(同名变量,在各自函数体内互不影响)。
全局变量:从定义开始往下,所有的地方都可以使用,在程序结束时被释放。若没有对全局变量进行赋值,系统自动默认为0。
局部变量与全局变量可以同名,使用时(程序从上往下执行)“就近原则”。