c++ 数组,函数指针

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

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

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

如果换一种表达方式:

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

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

不过这种表示还是不太直观。

再换一种表达方式呢?

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

这种是不是就非常清晰了。就算完全不懂 c++ ,也知道这个函数声明表达的是什么了。

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

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

以上4种,其实是完全相同的函数描述。返回类型,参数列表都是完全相同的。

3,4是非常简单易懂的。不过现在只是直到这个函数的参数类型与返回值类型相同,还不知道这个参数类型或者说返回值类型,到底是什么类型。

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

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

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

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

你可能感兴趣的:(大猫学C/C++)