c++ 数组,函数指针

先看一个极其复杂的函数声明:c++

std::string (*(*returnFunction(std::string (*(*pf)(std::initializer_list<std::string> list))[5]))(std::initializer_list<std::string> list))[5];

特别长,一页几乎不能显示彻底。
而后看其函数名,参数类型,及返回类型。几乎也是彻底看不出分别是什么。web

若是换一种表达方式:数组

auto returnFunction(std::string (*(*pf)(std::initializer_list<std::string> list))[5])
    -> std::string (*(*)(std::initializer_list<std::string> list))[5];

这样能一眼看出返回值类型了,还有函数名。参数列表也能看清楚了。svg

不过这种表示仍是不太直观。函数

再换一种表达方式呢?spa

using pm = std::string (*(*)(std::initializer_list<std::string> list))[5];
pm returnMethod(pm from);

这种是否是就很是清晰了。就算彻底不懂 c++ ,也知道这个函数声明表达的是什么了。指针

还有一种传统的简化方式。code

typedef std::string (*(*ptm)(std::initializer_list<std::string> list))[5];
ptm returnTypeMethod(ptm from);

以上4种,实际上是彻底相同的函数描述。返回类型,参数列表都是彻底相同的。xml

3,4是很是简单易懂的。不过如今只是直到这个函数的参数类型与返回值类型相同,还不知道这个参数类型或者说返回值类型,究竟是什么类型。对象

那就先看这个东西是什么: std::string (*(*ptm)(std::initializer_list<std::string> list))[5]

  1. ptm是一个指针
  2. (*ptm)后面有参数列表,因此 *ptm 是一个函数
  3. 这个函数的返回值是一个指针
  4. 返回值的指针,指向一个长度为5,元素为 string 类型的数组。

综合:ptm是一个函数指针。指向的是一个函数,其参数是一个 initializer_list类型的对象,其返回值是一个指针,该指针指向的是一个长度为5,元素为 string 类型的数组

那么,上面定义的函数就是这么一个函数,参数与返回值都是 ptm类型的。