侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【C++基础语法】函数

Allen Best
2023-05-08 / 0 评论 / 2 点赞 / 24 阅读 / 2,065 字
温馨提示:
本文最后更新于 2023-05-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
函数概念

简单的理解,函数就是将一段具有特定功能的代码单独封装起来,并在需要使用的地方可以快速调用这段代码。之前使用的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;
}
0

评论区