我认为需要注意的知识点都放在注释里面了。
//对于函数指针的定义
// 如:
// char*(*pfunction_case)(int,int); 申明了一个有两个整形参数的函数实例,实例名称为pfunction_case,返回值为char
// char*(*pfunction_case[])(int,int); 申明了一个有两个整形参数的函数实例数组,实例名称为pfunction_case,返回值为char
// 也可以这么定义:
// typedef char*(*pFuncType)(int,int);-----------申明函数类型
// pFuncType func_case; ----------------创建指针变量
// pFuncType func_arr_case[3]={f0,f1,f2};--------初始化
// funct_case = afunc_case; -----------赋值
// funct_case(int,int) -----------通过指针调用函数
#include<iostream>
#include<string>
using namespace std;
typedef int (*P2Arr)[3];
typedef int* Arr2P[2];
void p_arrtest(){
int a[2][3]={1,2,3,4,5,6};
cout<<a<<"\t"<<&a<<endl; //a与&a是一个值
int (*x)[3];
int * b;
int* y[2];
int **z;
x=a; //ok!!!!
z=y; //ok!!!! **z *号从左向右层层进*z=y[0],*(z+1)=y[1];
y[0]=new int[3];y[0][0]=1;y[0][1]=2;y[0][2]=3; //也暗示多维数组不同维之间可能是不连续的。
int* tmp=new int[10];
y[1]=new int[3];y[1][0]=4;y[1][1]=5;y[1][2]=6;
delete []tmp;
cout<<"**z:"<<*(*(z+1)+1)<<endl;
cout<<"a vs &a: "<<a<<"VS"<<&a<<endl; //一样一样的
b=(int*)a;cout<<b[5]<<endl; //二维变一维,ok
b=(int*)x;cout<<b[5]<<endl; //ok
b=(int*)y;cout<<b[5]<<endl; //no,不连续
b=(int*)z;cout<<b[5]<<endl; //no,不连续
}
char* f0(int n){
char * str=new char[n+1];
strcpy(str,"f0f000000");
return str;
};
char* f1(int n){
char * str=new char[n+1];
strcpy(str,"f1111111111");
return str;
}
char* f2(int n){
char * str=new char[n+1];
strcpy(str,"f2222222222");
return str;
}
char* (*pfunction[])(int )={f0,f1,f2}; //函数指针数组
char* pf_param_test(char* (*p)(int ),int n){ //函数指针作为参数传递,函数的参数由调用函数参数提供。
return (*p)(n);
}
int main(){
/****指针和数组之间的缠缠绵绵*******/
p_arrtest();
/*********end*******/
/**********函数指针****************/
char* f0(int );
char* (*pf)(int); //函数指针
//pf=f0; //函数指针赋值
pf=&f0; //和上面一样
cout<<"函数指针中:"<<endl<<(*pf)(2)<<endl<<endl;
cout<<"函数指针数组中:"<<endl;
cout<<(*pfunction[0])(0)<<endl;
cout<<(*pfunction[1])(1)<<endl;
cout<<(*(pfunction+1))(1)<<endl;
cout<<(*pfunction[2])(2)<<endl;
cout<<endl;
cout<<"函数指针作为参数: "<<endl<<pf_param_test(f0,0)<<endl;;
return 0;
}