26.空类型指针调用函数

26.指针-指针和函数-空类型指针调用函数


26.1 知识点

知识回顾 空类型指针

空类型指针是一种特殊的指针,它表示不特定类型的指针。指针变量可以指向任意的变量类型,具体存放何种类型,由后续赋值决定。赋值后,如果需要使用需要强转为对应的数据类型。

void* p = nullptr;
int a = 10;
p = &a;
// cout << *p << endl; // 编译报错,表达式必须是指向完整对象类型的指针
cout << *((int*)p) << endl; // 10

bool b = true;
p = &b;
cout << *((bool*)p) << endl; // 1 true

空类型指针指向函数及使用

void test()
{
    cout << "test" << endl;
}

int add(int a, int b)
{
    return a + b;
}

空类型指针可以指向任意类型的函数。必须将空类型指针强转为返回值类型和参数类型符合规范的指针后使用。

注意:强转时省略函数指针名即可。

void* func = test;

// void (*)() 中 void (*) 代表这是一个没有返回值的函数指针,() 代表这个函数指针没有参数
((void (*)())func)(); // test

// *(    (void (*)()   ) 中 *( ) 代表显示解引用调用
(*((void (*)())func))(); // test
func = add;

// int (*)(int, int) 中 int (*) 代表这是一个返回值是 int 的函数指针 (int, int) 代表这个函数指针有两个参数都是 int
cout << ((int (*)(int, int))func)(10, 20) << endl; // 30

// *(    (int (*)(int, int)    ) 代表显示解引用调用
cout << (*((int (*)(int, int))func))(20, 30) << endl; // 50

26.2 知识点代码

Lesson26_指针_指针和函数_空类型指针调用函数.cpp

#include <iostream>
using namespace std;
void test();
int add(int a, int b);
int main()
{
    std::cout << "空类型指针调用函数\n";

    #pragma region 知识回顾 空类型指针

    void* p = nullptr;
    int a = 10;
    p = &a;
    //cout << *p << endl;//编译报错 表达式必须是指向完整对象类型的指针
    cout << *((int*)p) << endl;//10

    bool b = true;
    p = &b;
    cout << *((bool*)p) << endl;//1 true

    #pragma endregion

    #pragma region 知识点一 空类型指针指向函数及使用

    //空类型指针可以指向任意类型的函数
    //必须将空类型指针强转为 返回值类型,参数类型 符合规范的指针后使用
    //注意:强转时省略函数指针名即可

    void* func = test;
    //void (*)()中 void (*)代表这是一个没有返回值的函数指针 ()代表这个函数指针没有参数 
    ((void (*)())func)();//test
    //*(    (void (*)()   )中  *(  )代表显示解引用调用
    (*((void (*)())func))();//test

    func = add;
    //int (*)(int, int)中 int (*)代表这是一个返回值是int的函数指针 (int, int)代表这个函数指针有两个参数都是int
    cout << ((int (*)(int, int))func)(10, 20) << endl;//30
    //*(    (int (*)(int, int)    )代表显示解引用调用
    cout << (*((int (*)(int, int))func))(20, 30) << endl;//50

    #pragma endregion
}

#pragma region 知识回顾 空类型指针

//空类型指针是一种特殊的指针
//它表示不特定类型的指针
//指针变量可以指向任意的变量类型
//具体存放何种类型,由后续赋值决定
//赋值后,如果需要使用需要强转为对应的数据类型

#pragma endregion

#pragma region 知识点一 空类型指针指向函数及使用

void test()
{
    cout << "test" << endl;
}

int add(int a, int b)
{
    return a + b;
}

#pragma endregion

26.3 练习题

如果用空类型指针void*装载以下函数,在使用时应该如何强转?

  1. void test()

    强转为:void (*)()

  2. int* test(int* i, string str)

    强转为:int* (*)(int*, string)

  3. void test(int array[][4])

    强转为:void (*)(int (*)[4])



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏