目录
一、函数基本知识
对于函数,那么首先肯定是先要定义一个函数。而函数大体分为两种
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);
}