标签 - C

C++ C    2020-05-18 19:35:13    11    0    0

在 C 里面,可以用 typedef 来为一个已有的数据类型增加一个新的别名。比如:

  1. typedef int Length;

这种简单的形式,大家都能理解。可是遇到下面这种形式,不少人就傻眼了。比如:

  1. typedef int (*PFI)(int, const char *);

难道是把 int 数据类型定义成了 (*PFI)(int, const char *) 的数据类型,可是哪有这样的数据类型啊。即使被别人告知这是定义了一种函数指针类型,但却怎么也无法和 typedef int Length 这种形式关联起来,不是应该有一种已有的数据类型,一种新的数据类型吗?可是它们在哪呢?

我们把上面的表达式稍做改变,疑惑就解开了,如下:

  1. typedef int (int, const char *) * PFI;
  2. ~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~
  3. 原来的数据类型 别名

或者:

  1. typedef int (int, const char *) *PFI;
  2. ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
  3. 原来的数据类型 别名

所以,这个表达式是定义了类型为 PFI 的函数指针类型,指向的函数,返回值是 int 型,形参是 intconst char *。所以,它的使用就很好理解了,指向一种函数类型(返回值和参数列表形式相匹配)的指针,比如:

  1. //测试代码,所以没有写得很严谨
  2. int str_chr(int index, const char *s)
  3. {
  4. return s[index];
  5. }
  6. PFI funp = str_chr;
  7. //对于函数指针,这里也直接写成 PFI funp = &str_chr; 这种写法很少用
  8. int ret = funp(5, "baurine");
  9. //对于函数指针,也可以直接写成 int ret = (*funp)(5, "test");

也可以不将 PFI 定义成函数指针类型,而是直接定义成函数类型,如下: