函数指针引用
函数指针引用做为参数,改变函数指针。
函数指针引用作为返回值,实现调用getit(p)("hello world");
getp(p)("mspaint");函数调用如何理解:调用函数返回值(返回值是一个函数指针)的函数。
getp 调用的函数名 p 函数参数 (“mspaint”)因为getp的返回值是一个函数指针,因此 它是调用返回的函数的参数。
说明引用的本质是指针的两种情况
int *getp()
{
int a =5;
return &a;//worning 返回局部变量的地址
}
int &getint()
{
int a=5;
return a;//worning 返回局部变量的地址
}
struct Mystruct {double &a;}; sizeof(Mystruct )==4;
引用函数指针数组
int (*p[4])(int ,int){add,su,mul,divv};
int (**ppp)(int,int ){new (int (*[4](int,int)){add,sub,mul,divv})};写的太乱,请看代码。
#include <iostream>
#include <cstdlib>
using namespace std;
//引用与函数指针
int gocmd(const char *cmd)
{
system(cmd);
return 1;
}
int showcmd(const char *cmd)
{
cout<<cmd;
return 1;
}
//引用作为函数指针参数。
void change(int(* &p)(const char *cmd))
{
p = showcmd;
}
int(* &getp( int (*&p)(const char *cmd) ))(const char *)
{
p = showcmd;
return p;
}
void main()
{
int(*p)(const char *)(gocmd);
p("calc");
//change(p);
//p("calc");
getp(p)("mspaint");
cin.get();
}
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int divv(int a, int b)
{
return a / b;
}
int mul(int a, int b)
{
return a * b;
}
void main()
{
//int(*p)(const char *)(gocmd);
//p("calc");
change(p);
p("calc");
//getp(p)("mspaint");
int(*p[4])(int a, int b){add,sub,divv,mul};
int(**pp)(int a, int b) { new (int(*[4])(int, int)){add,sub,divv,mul} };
for (int i = 0; i < 4; i++)
{
cout << p[i](10, 20) << endl;;
}
for (int i = 0; i < 4; i++)
{
cout << pp[i](10, 20) << endl;;
}
int(*(&rp)[4])(int a, int b)(p);
int(**&rpp)(int a, int b)(pp);
for (auto i : rp)
{
cout << i(20,10) << endl;
}
for (auto i : rp)
{
cout << i(20, 10) << endl;
}
using F= int(**)(int, int);//cpp风格别名
for (F ppx = pp; ppx < pp + 4; ppx++)
{
cout << (*ppx)(20, 10) << endl;
}
cin.get();
}