今天写一下函数部分的知识点(函数学习小结)

函数

简单介绍一下函数的基础知识:
引入函数之前先介绍一下子程序
子程序本质是一个相对独立的程序段,用一个标识符代替。子程序的使用不仅缩短了程序,节省了内存空间及减少了程序的编译时间,而且有利于结构化程序设计。
接下来我来介绍函数:
函数定义的语法形式:
数据类型 函数名(形式参数表)
{
函数体 //执行语句
}
函数的数据类型是函数的返回值类型,函数名是标识符,形式参数可以是空的(即无参函数),也可以有多个形参,用逗号隔开即可。但是无论有无形参,圆括号不可省略。形参必须标注类型,可以是变量名、数组名、指针名,作用是实现主调函数与被调函数的关系。
值得注意的是函数不允许嵌套,嵌套函数视为非法。
函数的形式:
函数的形式从结构上分为三种:无参函数,有参函数,空函数。
无参函数即没有参数传递的函数,一般不需要带回函数值,此时函数类型说明为void,有参函数则一般需要带回函数值,而空函数整体只有一对花括号,花括号内没有任何语句的函数,例如:
函数名()
{ }
空函数不完成任何工作,只占据一个位置。作用是在大型程序设计中用于扩充函数功能。
函数的声明与调用:
调用函数之前要先声明函数原型,其格式如下:
类型说明符 被调函数名(含类型说明的形参表)
与函数定义的第一行类似,只是多了一个分号,成为了一个声明语句。
函数调用可以作为一条语句 ,这时函数可以没有返回值,同时函数调用也可以出现在表达式中,这时就必须有一个明确的返回值。返回语句的一般表达形式为:return(表达式);当一个函数没有返回值时,函数中可以没有return语句,也可以写为return;这时函数没有返回值,而只把流程转向主调函数。
在调用函数时需要注意:
实参列表中应该给出与函数原型形参个数相同、类型相符的实参。在主调函数中的参数称为实参,实参一般应具有确定的值。实参可以是常量、表达式,也可以是已有确定值的变量、数组或指针名。
函数的传值调用与传址调用:
传值调用是将实参的数据值传递给形参,即将实参值拷贝一个副本存放到被调用函数的栈区中,但是形参值可以改变,实参并不会随形参改变而改变,因此参数传递方向只是从实参传递到形参,简称为单向值传递。
而传址调用是将是实参变量的地址值传递给形参,这时形参是指针,即让形参的指针指向实参地址,这样就可以变形参以变实参。
例如:
传值调用:

void swap(int a,int b)
{
    int tmp = a,a = b,b = tmp;
}
int main()
{
    int c=1,d=2;
    swap(c,d);
    cout<<c<<' '<<d<<endl;
    return 0;
}

该程序输出1 2

传址调用:
该程序虽然在swap函数中交换了a,b两数的值,但是在main函数中没有交换,因为swap只是交换c,d两数的副本的值,实参数没有改变,并没有达到交换的目的。

void swap(int &a,int &b)
{
    int tmp = a,a = b,b = tmp;
}
int main()
{
    int c=1,d=2;
    swap(c,d);
    cout<<c<<' '<<d<<endl;
    return 0;
}

该程序输出2 1
在次程序中,swap函数的参数为传址调用,&a是指实参变量的地址传给形参,所以,在此函数swap中修改a,b的值相当于在主函数main中修改c,d的值。
全局变量、局部变量及它们的作用域:
全局变量又叫外部变量,即定义在函数外的变量,因此局部变量又叫内部变量,是定义在某一函数内部的变量。还有一个在代码块内定义的变量,此变量的存在时间和作用域都被限制在该代码块内部,如for(int i;i<=n;i++){sum+=i}中的i是在for循环中定义的,其存在时间和作用域只能被限制在该for循环语句中。
另外注意需要全局变量的点:
过多的使用全局变量,会增加调试难度,因为多个函数都会改变全局变量的值,不易判断某个时刻全局变量的值。
同时还会降低程序的通用性。如果将一个函数移植到另一个程序中,需要将全局变量一起移植过去,但同时还会出现重名问题。
全局变量在程序执行过程中一直占用内存单元。
全局变量在定义时若没有赋初值,其默认值为0。
局部变量:
局部变量的储存空间是临时分配的,当函数执行完毕,局部变量的空间就被释放,其中的值无法保留到下次使用。
在不同的函数中变量名可以相同,他们分别代表不同的对象,在内存中占据不同的内存单元,互不干扰。
另外局部变量可以屏蔽全局变量。
局部变量没有赋值时,值是随机的,记得要初始化初值。
局部变量受栈空间大小限制,大数组需要注意。即局部变量的数组不能开的很大,全局变量随便。