不易理解的指针(C/C++)

不易理解的指针(C/C++)

See also


#include <iostream>

/**
 * 不易理解的指针:
 *
 * - 函数指针
 * - 指针数组
 * - 数组指针
 * - 返回函数指针的函数
 *
 * Compile:
 * g++ pointer.cpp -std=c++11 -Wall -Wextra
 *
 * @note better NOT function pointer, but use C++ functor if you can, e.g.
 * std::function
 * boost::function
 */

int main() noexcept
{
    // 函数指针和(函数)指针数组
    int (* a1[10])(int) = { nullptr };// The array of 10 function pointers, init [0] to nullptr, others 0
    // ERROR: int (error1[10])(int) = { nullptr };
    int* a2[10] = { nullptr };// The array of 10 int pointers, init [0] to nullptr, others 0
    std::cout << std::is_array<decltype(a2)>::value << '\n';// 1

    typedef int (function_t)(int);// Functor type
    typedef int function2_t(int);// Functor type
    int (foo)(int);// 函数声明
    typedef int (* functionptr_t)(int);// Functor pointer type (函数指针类型)
    // Another array of 10 function pointers, init [0] and [1] to nullptr, others 0
    function_t* a4[10] = { nullptr, nullptr };
    functionptr_t a5[10] = { nullptr, nullptr };

    std::cout << std::is_same<function_t, function2_t>::value << '\n';// 1
    std::cout << std::is_same<decltype(a1), decltype(a4)>::value << '\n';// 1
    std::cout << std::is_same<decltype(a1), decltype(a5)>::value << '\n';// 1

    int (* a3)(int) = nullptr;// 函数指针
    function_t* a6 = nullptr;// 函数指针
    functionptr_t a7 = nullptr;// 函数指针
    std::cout << std::is_same<decltype(a3), decltype(a6)>::value << '\n';// 1
    std::cout << std::is_same<decltype(a3), decltype(a7)>::value << '\n';// 1

    // 数组指针
    function_t* (* b1)[10] = nullptr;// The pointer of an array of 10 function pointers: b1
    // ERROR: function_t (*error2)[10] = nullptr;
    functionptr_t (* b2)[10] = nullptr;// The pointer of an array of 10 function pointers: b2
    typedef function_t* functionptrarr_t[10];// The array type of array of function pointers
    typedef functionptr_t functionptrarr2_t[10];// The array type of array of function pointers
    functionptrarr_t* b3 = nullptr;// 数组指针
    functionptrarr2_t* b4 = nullptr;// 数组指针
    b4 = b3 = b2 = b1;// OK
    std::cout << std::is_same<decltype(b1), decltype(b2)>::value << '\n';// 1
    std::cout << std::is_same<decltype(b1), decltype(b3)>::value << '\n';// 1
    std::cout << std::is_same<decltype(b1), decltype(b4)>::value << '\n';// 1
    int (* b5)[10] = nullptr;// The pointer of an array of 10 int pointers: b5
    typedef int intarr_t[10];// The array type of array of 10 int pointers
    intarr_t* b6 = nullptr;// 数组指针
    b6 = b5;// OK
    std::cout << std::is_same<decltype(b5), decltype(b6)>::value << '\n';// 1
    std::cout << std::is_array<decltype(b1)>::value << '\n';// 0

    // 返回函数指针的函数
    // foo2 是一个函数(声明), 该函数的参数是第一个 int 型, 第二个 char* 型,
    // 该函数返回值的是一个函数指针(对象),
    // 这个函数指针(指向的函数)的类型是 int 型返回值和一个 int 型参数.
    int (* foo2(int, char*))(int);
    // 即上面等价于:
    typedef int foo_t(int);
    foo_t* foo3(int, char*);
    std::cout << std::is_same<decltype(foo2), decltype(foo3)>::value << '\n';// 1

    return 0;
}