函数概念
简单的理解,函数就是将一段具有特定功能的代码单独封装起来,并在需要使用的地方可以快速调用这段代码。之前使用的sqrt(),abs()等都是函数。
函数定义
函数由返回值类型,函数名,形参,函数体组成。形参是函数的操作数,在一对圆括号中声明,用逗号分隔。函数执行的具体功能的代码在函数体内定义。
int func(int v1,int v2){
if(v1>=v2){
v2+=10;
}
return v2;
}
//以上,定义了一个名为func的函数,返回值是int类型的值,有两个int类型的形参。调用func函数时,需要提供两个int型的值传递给函数,函数执行完后返回一个int型的值。
参数和返回值的类型一般是如int或者double或者是char等基本数据类型,如果函数的内容只是输出某些内容,返回值可以是void,不需要用return语句**(希望函数运行中退出的情况除外,因为,void类型的函数可以用过语句return ;表示退出函数)**。
函数调用
使用**函数名()**实现对函数的调用。括号的内部是一组(可以为空)的实参。函数的调用结果类型是函数返回值的类型,函数的运算结果是返回值本身。
int a,b;
cin>>a>>b;
cout<<func(a,b)<<endl;
函数调用的过程,1)使用对应的实参初始化函数的形参,2)被调用的函数开始执行。
上方代码的执行过程:当func被调用时,首先创建v1,v2两个int型变量,并将两个变量的值初始化为调用func时传递的实参。v1初始化为a的值,v2初始化为b的值。
函数返回值
函数的返回值一般是基本数据类型,若是其他类型作为返回值要更加复杂,如果函数不需要返回值,则返回类型为void。在定义函数时没有显式的指定返回值类型是不合法的,早期的C++版本是可以将不定义返回值类型隐式的定义为int,但标准的C++中,是不正确的。
注意: 如果在执行函数的过程中碰到了return语句,将直接退出这个函数,不去执行后面的语句。
main函数也是有返回值的一般情况下返回0,0代表程序“正常结束”,在算法竞赛中,除了有特殊规定之外,总是让main函数返回0。
函数参数传递
传值调用
这种方式相当于将实参的值复制给形参,无论形参如何改变,都不会对实参的值产生影响。例如:
void swap(int a,int b){
int t;
t=b;
b=a;
a=t;
}
int main(){
int x,y;
cin>>x>>y;
swap(x,y);
cout<<x<<y;
return 0;
}
上述例子中,x和y的值并没有被交换。原因是:x和y的值赋值给a和b,相当于a=x,b=y;swap函数内a和b的值发生交换,但是对于x和y并没有影响。
传址调用
要想通过swap函数实现交换x和y的值,需要将上面的程序更改为:
void swap(int *a,int *b){
int t;
t=*b;
*b=*a;
*a=t;
}
int main(){
int x,y;
cin>>x>>y;
swap(&x,&y);
cout<<x<<y;
return 0;
}
变量名前面加“&”得到的是该变量的地址。
变量都是放在内存中的,而内存中的每个字节都有一个称为地址(address)的编号。每个变量都占有一定数目的字节(可用sizeof运算符获得),其中第一个字节的地址称为变量的地址。
用int* a声明的变量a是指向int型变量的指针,函数调用时,&x是将x的地址存放到指针a中。
*a是指“a指向的变量”,而不仅是“a指向的变量所拥有的值”。理解这一点相当重要。例如,*a = *a + 1就是让a指向的变量自增1。甚至可以把它写成(*a)++。注意不要写成*a++,因为“++”运算符的优先级高于“取内容”运算符“*”,实际上会被解释成*(a++)。
这里涉及到指针的知识,指针是比较复杂的语言特性,需要非常熟悉的指针特性才不容易使用错误,因此在自己写程序的时候要尽量不要滥用指针,否则会引发一些奇怪的错误。
局部变量与全局变量
函数的形参和在函数内声明的变量都是该函数的局部变量。无法访问其他函数的局部变量。局部变量的存储空间是临时分配的,函数执行完毕时,局部变量的空间将被释放,其中的值无法保留到下次使用。
在所有函数外声明的变量是全局变量,可以被任何函数使用。操作全局变量有风险,应谨慎使用。
数组作为参数
int s(int t[],int n){
int c=0;
for(int i=0;i<n;i++){
c+=t[i];
}
return c;
}
把数组作为参数传递给函数时,实际上只有数组的首地址作为指针传递给了函数。因此在函数定义中的int a[]等价于int *a。下方代码与上方代码功能相同。
int s(int *t,int n){
int c=0;
for(int i=0;i<n;i++){
c+=t[i];
}
return c;
}
评论区