include <iostream>

using namespace std;

//递归
/*
递归:递归是函数自身调用自己的一种称呼,递归可以处理一些相同动作时使用,但是如果递归的量级很大时则不建议使用。
在使用递归是需要设置停止事件,不然递归会一直重复下去。
*/

void digui(int a) {
    cout << "我是递归中的一句话" << endl;
    a = a - 1;
    if (a > 0)
        digui(a);
}

//递归中可以包含多个递归
void duochongdigui(int a, int b, int c) {

cout << b << " "<< c << endl;
a = a - 1;
if (a == 0) {
    return;
}
int d = b - 2;
int e = c - 1;
cout << "分割-1" << endl;
duochongdigui(a, d, e);
cout << "分割-2" << endl;
duochongdigui(a, e, d);

}

//函数指针
/*
数据都是被存放在内存中的,有存当然就有取。怎么取?当然是用地址来找到数据然后拿出,不仅数组有地址,基本数据类型
有地址,当然函数也会有地址,事实上只要是存放在内存中的数据都会有一个对应的地址。有地址当然就会有指针,函数也是如此。
函数指针就是这个存储地址的地方,存储整个函数地址的工具。
函数地址是存储机器代码的内存的开始地址,它其中的一个作用就是可以将另一个函数的地址传递给别的函数,这样就能让函数间调用对方。
如何实现函数间的调用:
1.获取函数的地址。(对函数使用&即可获取函数地址,获取地址时函数后面不加括号)
2.声明一个函数指针。
3.我使用函数指针来调用函数。
*/
//声明一个函数指针

void hanshu1(int) {};

  void (*hanshuzhizhen)(int);

/*
定义函数指针:首先需要去顶指针函数的类型,必须与被传递的函数的返回类型一致,然后跟()里面书写函数名,要加*,
然后再跟()里面的数据类型要和被传递的函数类型保持一致。
*/
//使用函数指针来调用函数

int hanshu2(int a) {
    return a;
  }
  int (*hanshuzhizhen2)(int);

//如何在其他函数的形参中添加函数指针
void hanshu3(int a, int (*pt) (int)) {};//只需要在需要的位置添加函数指针声明即可。

//函数指针数组。
void (*pa[3])(int, double);//定义函数指针数组,只需要在名称后面跟一个[]里面放进数组长度即可。
/*
如何使用函数指针数组:数组名是指向数组首地址的指针,所以pa是事项函数指针的指针,像普通数组那样去使用就可以。
比如像调用pa数组里的第二个函数指针则可以pa[2]即可。
*/

//创建一个指向函数指针数组的指针

int* (*(*pe)[3])(int, double);

/*
————————————————————————————————
(*pe)(int,double)创建一个函数指针。
pe)[3](int,double)创建一个函数指针数组。

  • ((pe)[3])(int, double)创建一个指向函数指针数组的指针。
    ————————————————————————————————

如何使用:pe是指向数组,那么pe就是数组。而(pe)[i]是数组中的第i个元素。即函数指针,所以调用方式为(*pe)[i](int,double),
pe)i则是返回指针指向的值。
*/
//注意区分*是声明指针的符号还是解引用符。
int main() {

//递归输出语句
cout << "递归输出语句" << endl;
digui(6);
cout << endl;

//多重递归输出
cout << "多重递归输出" << endl;
duochongdigui(3, 7, 8);
cout << endl;

//函数指针输出
cout << "函数指针输出" << endl;
cout << *hanshuzhizhen << endl;
hanshuzhizhen = hanshu1;//赋值动做要在main函数中进行,不然报错,原因不知道。

//使用函数指针来调用函数
cout << "使用函数指针来调用函数输出" << endl;
hanshuzhizhen2 = hanshu2;
cout << "普通函数输出" << endl;
int c = hanshu2(5);
cout << c << endl;
cout << "函数指针输出" << endl;
int d = hanshuzhizhen2(6);//使用函数指针时可以像使用普通函数时那样通过名称来直接使用。
cout << d << endl; 

}

文章目录