函数的相关概念以及实例

目录

一、函数基本知识

二、函数的原型与调用

三、函数的参数和按值传递

四、函数和数组

五、指针和const

六、递归


一、函数基本知识

对于函数,那么首先肯定是先要定义一个函数。而函数大体分为两种

1、没有返回值的函数

void functionName(parameterList){

statement(s)

return;

}

其中,当该函数已经确定为没有返回值的同时,可以直接定义为void,也或者是在不确定的前提下先行定义为void在之后的调试过程中再次进行修改

2、有返回值的函数

typeName functionName(parameterList){

statement(s)

return value;//value与typeName同类型

}

对于有返回值类型的函数,则一定要有返回语句。返回的值不仅仅是常量,变量还可以是一些表达式。只是在最终的结果必须是定义的类型或者是可以被强制转换的类型。

但在返回的时候,是有一定的限制的,不能返回数组,但是可以通过将数组作为结构或对象组成部分来返回

函数在执行的途中遇到return时便会结束,因此一个函数中一般只会有一条return语句以免发生错误。

例:返回x的三次方

double cube(double x){
    return x*x*x;
}

二、函数的原型与调用

1、函数的原型

首先 我们先了解一下函数的原型能够干什么

一、编译器正确处理函数的返回值

二、编译器检查使用的参数数目是否正确

三、编译器检查使用的参数类型是否正确;如果不正确,则转化为正确的类型(如果有可能的话)

那么原型是什么样子的呢?

它其实是一条语句,因此必须以分号结束。也就是赋值函数定义中的函数头并添加分号。

2、函数的调用

在知道了函数的原型后,我们便可以调用这个函数了,由函数的原型的功能可以明白,函数的原型是书写在主函数main之前的以告诉编译器一些相关内容的。

那如何调用呢?

1、无返回值的函数调用

在main中 书写“函数名和参数();”即可成功调用。

2、有返回值的函数调用

与上述一致,且拥有另一个用法,那就是可以充当赋值运算符的右值,即将返回的值赋值给同类型的变量。

三、函数的参数和按值传递

1、函数的参数

在函数中声明的变量包括参数均是函数私有的

特性:

在函数调用时候分配内存,在函数调用结束时释放内存。

而在函数内定义的“x”与其他函数或主函数中定义的x是不重复的,因为x为局部变狼只在所在函数中起作用。

在函数中参数可能不止一个,这时需要我们的“,”逗号运算符出场了

在括号中的多个参数之间加上逗号即可完成函数中的参数定义。

2、按值传递

通俗点讲就是将数值参数传递给参数,而在函数中将该值赋值给一个新的变量。

四、函数和数组

1、数组做参数

在c++中对于数组名的解释是其第一个元素的地址。

但这种解释有一些例外:

1、数组名使用sizeof函数将得到整个数组的长度(是以字节为单位的)

2、将地址运算符&用于数组名上返回的是整个数组的地址

将一维数组做参数时即:

int a[4]
void test01(int *p){

}

其中*p可以等价为a[0]的值,*(p+1)等价于a[1]的值

当不加*解引用符号时候表示的是该元素所在的地址。

在数组充当参数传入的时候有可能会误操作将原数组的元素给修改

为了避免这种错误我们可以通过const来处理这种情况

int a[4]
void test01(const int *p){

}

此时test01函数只能访问a数组而不能对其进行修改。

2、函数与二维数组

int a[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
//shuchu函数将a数组输出到屏幕
void shuchu(int (*ar)[4],int n){

    for(int i=0;i<n;i++){
        for(int j=0;j<4;j++){
            cout<<*(*(ar+i)+j)<<"\t";
        }
        cout<<endl;
    }
}

为了便于理解,一下这一段东西还是需要理解的 而不能死记哦!!!

ar                        零行零列的地址

*(ar)                    零行零列的元素

ar+1                    一行零列的地址

*(ar+1)                一行零列的元素

*(ar+1)+2            一行二列的地址

*(*(ar+1)+2)        一行二列的元素

。。

五、指针和const

当这两个东西结合起来是容易理解,const是为了限定而存在,指针是为了指向一段内存而存在

那么const与指针结合起来便存在三种不同的指针

int a = 3;

int  b= 4;

int *p = a;

以如上三个语句为例

1、指向常量对象(a的值不可以修改,但p可以指向b)

const int *p = a;

2、固定指针的指向不能修改所指向的地址(a的值可以修改,但不可以将p指向b)

int const *p = a;

3、地址与对象均不可以进行修改(a的值不可以修改,且p也不能狗指向b)

const int const *p = a;

六、递归

对于递归:在需要一项工作不断分为两项较小的类似的工作时适用于递归

也被称之为“分而治之

通俗的讲就是在这个函数的本身中又调用了自身函数。

举个例子帮助大家理解一下吧。

一下是一个斐波那契数列的前二十项的输出

斐波那契:F(0)=0,F(1)=1

                  F(n)=F(n-1)+F(n-2)        (n>=2且为正整数)

# include< iostream>
using  namespace  std;
Void fun(int n){
int a [20];
a [0]=1;
a [ 1]=1;
cout<<a [0]<<"\t"<<a [ 1]<<"\t";
for(int i=2; i< n;i++){
a [i]=a[i- 1]+a [i-2];
cout<<a [i]<<"\t";
}
}
int main(){
int c = 20;
fun( c);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值