一 函数的定义
1.函数定义的语法形式
数据类型 函数名(形式参数表)//函数的数据类型是函数的返回值类型(例如:viod,无返回值)
一个程序中,除了主函数为main外,其余的函数首字符为字母即可,最好较简单。
{
函数主体 //执行语句
}
注:
*形参表可为空,也可有多个,形参之间用逗号隔开,圆括号不能省略,其中形参可以是各种类型的,如变量名、数组名或指 针名。
*函数不能内镶另一个函数,但可以镶套同一个函数。
2.函数定义的例子
int max(int x,int y)
{
return x>y? x:y; // if(x>y) return x; else return y; 如果x大于y返回值为x反之为y.
}
3.函数的形式
(1)无参函数 无需返回值,函数类型为viod;
(2) 有参函数 一般需要返回值,函数类型较多,如int ,bool等;
(3) 空函数 只有一个空架子
如 :函数名 ()
{ }
用于大型程序设计中扩充函数功能。
二 函数的声明和调用
1.函数的声明和调用
在函数调用前先声明函数原型
如 :
#include<iostream>
using namespace std;
int max(int , int); //声明的函数原型,也可写为 int max(int x,int y)
int main() 。。。。。。。。。。。。。。。。。。。。。。。。。。。(1)
{
int x,y;
cin>>x>>y;
max(x,y); //
在此处调用函数
}
int max(int x,int y) //定义的函数体。。。。。。。。。。。。。。。。。。。(2)
{
return x>y? x:y;
}
注:
如果(1)和(2)的位置互换,则不用声明函数原型。
2. 函数的返回值
返回语句是return 。其一般形式是 return (表达式)//即为“return s”等;
如果只有“return”则表示没有返回值,而只是把流程转向主函数。
三. 函数的传值调用
其特点是将调用函数的实参表中的实参值依次对应的传递给被调用函数的实参表中的形参。
注:
函数的实参与形参个数相等且类型相同。
在C++语言中,函数调用方式为 传值调用 和 传址调用。
1. 传值调用
这种调用方式实际只是将原本的实参值拷贝一个副本放入被调用函数的栈区中,而在被调用的函数中,形参值可以随意改变,不影响主函数中的实参值。
例如:
#include<bits/stdc++.h>
using namespace std;
viod swap(int a,int b)
{
int t=a;a=b;b=t;
}
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两个变量副本的值,实参却没有交换,并没有达到目的。
2. 传址调用
利用将实参的地址值传递给形参,从而直接让形参指向实参,达到交换的目的
例如:
#include<bits/stdc++.h>
using namespace std;
viod swap(
int &a,int &b) //形参是传址调用,&a,&b代表将地址值传递给形参
{
int t=a;a=b;b=t;
}
int main()
{
int c=1,d=2;
swap(c,d)
cout<<c<<" "<<d<<endl;
return 0;
} //最终输出为2 1
注:也可用指针变量来解决
1. 指针变量定义及赋值
说明 样例
类型说明符 *指针变量名; int a=10; int *p;
取地址运算符 :& p=&a;
间接运算符 : * *p=20;
指针变量直接存取的是内存地址 cout<<p; 结果不是数值
间接存取才是储存类型的值 cout<<*p; 结果不是数值
其中不允许将数值赋予指针变量,如:int *p; p=10; 是错误的
而且被赋值的指针变量前不能再加“*”说明符,如 *p=&a; 是错误的
指针用法举例:
#include <bits/stdc++.h>
using namespace std;
void swap(int *,int *);
int main()
{
int a=3,b=4;
cout<<"a="<<a<<"b="<<b<<endl;
swap(&a,&b);
cout<<"a="<<a<<"b="<<b<<endl; //此时a,b的值交换
return 0;
}
void swap(int *x, int *y)
{
int t=*x;
*x=*y;
*y=t;
} //此时x,y所代表的位置交换
四. 函数的应用举例
例如:用冒泡法对数组元素按由大到小排顺序。(数组作为函数参数)
#include<bits/stdc++.h>
using namespace std;
viod mao(int [],int); //相当于 viod mao(int a[],int n);
int main()
{
int b[10]={1,2,3,4,5,6,7,8,9,10}; //大数据组应开为全局变量
cout<<"排序前“;
for(int i=0; i<10; i++)
cout<<b[i]<<',';
cout<<endl;
mao(b,10);
cout<<"排序后";
for(int i=0; i<10; i++)
cout<<b[i]<<',';
cout<<endl;
return 0;
}
viod mao(int a[],int n)
{
for(int i=1; i<n; i++)
{
for(int j=0; j<n-i; j++)
if(a[j]>a[j+1]) //判断并交换变量
{
int t=a[j]; a[j]=a[j+1]; a[j+1]=t;
}
}
}
五. 全程变量,局部变量和它们的作用域
在函数外定义的变量称为外部变量或全局变量,在函数内部定义的变量称为内部变量或局部变量。
1. 全局变量
#include<bits/stdc++.h>
using namespace std;
int x,y; //此位置为全局变量
int max(int x,int y) //x,y为全局变量
{
return x>y? x:y;
}
int main()
{
cin>>x>>y;
//x,y为全局变量
max(x,y);
}
注: *
在一个函数内部,既可使用本函数定义的局部变量,也可使用在此函数前定义的全局变量。
*
如果一个程序里多个函数都要用到同一个变量,则可将其定义为全局变量。
*
缺点此时这些函数都能对定义的全局变量进行改动,不易判断某个时刻全局变量的值。
*过多的使用全局变量,会降低程序的通用性。如果将一个函数移植到另一个程序中,需要将全局变量一起移植过去,同时还可能出现重名问题。
*全局变量在程序执行的全过程中一直占用内存单元。
*全局变量在没有赋值的情况下默认为0。
2. 局部变量
(1)局部变量只在定义它的函数内部有效。储存空间是临时的,当函数执行完毕局部变量的储存空间就被释放,其中的值无法保留到下次使用。
(2)由于局部变量的作用域只限于本函数内部,所以在不同的函数中变量名可以相同,它们代表不同的对象,储存位置也不同互不干扰。
(3)一个局部变量和一个全局变量是可以重名的,在相同的作用域中局部变量有效是全局变量无效,即局部变量可以屏蔽全局变量。
(4)在代码块中定义的变量的存在时间和作用域将被限制在代码中,例如:for(int i=0;i<3;i++){sum+=i}中的“i”是在for循环语句中定义的,存在时间及作用域只限于该for循环语句中。
(5)与其他程序设计语言不同的是,主函数main中定义的变量也是局部变量。
(6)全局变量数组初始全部为0,局部变量值是随机的,要初始化初值,局部变量受栈空间大小限制,大数组要注意。
即局部变量数组不能开很大 ,全局变量随意。
心得:函数比较好理解,在有一定基础之后会用起来感觉比较随意,但是应用起来还是要具体问题具体分析。。。
比较难的题还是需要用心来解决,有时候还会感觉自己的“头发”不够用,但是解决问题的那一瞬间还是很爽的(^0^) hhh....