不易理解的指针(C/C++)
See also
- https://yuiwong.org/gitlab/cpp/cppbasics/blob/master/category/pointer/pointer.cpp
- https://yuiwong.org/gitlab/cpp/cppbasics
#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;
}