乐趣区

C/C++ 函数指针

函数指针
函数是存放在内存的代码区域内
栗子
int test(int a){
return a;
}
int main(int argc, const char * argv[]){
// 这里定义了一个参数为 int 类型的函数,函数的返回值为 int 类型的指针 fp
int (*fp)(int a);
// 将 test 函数的地址赋值给指针 fp,完成一个指向函数。该指针指向的函数的参数为 int 类型
fp = test;
// 调用 test 函数,这里返回的值为 2
cout << fp(2) << endl;
return 0;
}
使用 typedef
int test(int a){
return a;
}
int main(int argc, const char* argv[]){
// 定义一个指向函数的类型
typedef int (*fp)(int a);
// 定义了一个指向函数类型的变量 f
fp f = test;
// 进行调用
cout << f(2) << endl;
return 0;

}
函数指针作为参数传递给函数
int test(int a){
return a – 1;
}
// (*fun)(int) 定义了一个 int 类型返回值也为 int 类型的函数指针 fun
int test2(int (*fun)(int), int b){
// 这里调用 fun 指针指向的函数,其传入的参数为 10
int c = fun(10) + b;

}
int main(int argc, const char * argv[]){
// 定义函数指针
typedef int (*fp)(int a);
fp f = test;
// 调用 test2 的时候,由于指针 f 指向 test 函数的地址,将 tets 函数的地址作为参数传递给 test2,然后 tets2 再次调用 test 并传入值为 10
cout << test2(f, 1) << endl;
}
指向函数的指针数组
void t1(){
cout << “test1” << endl;
}
void t2(){
cout << “test2” << endl;
}
void t3(){
cout << “test3” << endl;
}
int main(int argc, const char * argv[]){
// 定义一个参数为空的函数指针
typedef void (*fp)(void)
// 定义一个指向函数的指针数组
fp b[] = {t1, t2, t3};
// 这时通过数组下标,间接的调用
b[0]();
}
指向类成员函数的函数指针
由于虚函数是偏移量,所以取得的只是一个索引,即在虚函数表的偏移地址非虚函数,返回的是在内存中的真实地址普通函数指针保存的是函数体开始的地址,即,代码指针。
数据指针 用于保存数据的指针
由于虚函数的存在,所以在在类的成员函数指针在调用的时候需要传入类的实例化后的对象,用于找到虚函数在内存中的函数体开始的地址。

退出移动版