[C 语言笔记--Day14] Pointers to Functions II

这篇文章接续上一篇的话题

来纪录一些更加奇怪的写法以及如何解读

最後也会纪录一下我看过的一个 pointer to function 的例子

大纲

  1. 解读时的原则
  2. 一些限制
  3. 实际的例子:xv6
  4. 参考资料

1. 解读时的原则

  • a) 由内而外的解读
  • b) []() 优先於 *

例一:

int *ap[10];

基於原则 b) 应该解读成 array of pointers (array 先解读,再解读pointer)

而非 pointer of array

例二:

float *fp(float)

function (先解读(float)) that returns a pointer (再解读float *)

例三:

float (*fp)(int)

type of fp

  1. pointer to (解读 (*fp) 因 a) 由内而外)
  2. function with int argument (先解读 ())
  3. returning void

例四:

int *(*x[10])(void)

type of x

  1. array of
  2. pointers to
  3. functions with no argument
  4. returning pointer to int

2. 一些限制

int f(int)[];           /*** WRONG ***/

不可回传 function

int g(int)(int);        /*** WRONG ***/

array of funtionis 不成立,
个人的解读是,array 的每个 element 都要相同大小才行:

int a[10](int);         /*** WRONG ***/

(但 array of function to pointer 是可以的)

3. 实际的例子:xv6

在 xv6-riscv 中的 kernel/syscall.c:108 也用到了这种复杂的宣告:

static uint64 (*syscalls[])(void) = {
[SYS_fork]    sys_fork,
[SYS_exit]    sys_exit,
[SYS_wait]    sys_wait,
[SYS_pipe]    sys_pipe,
[SYS_read]    sys_read,
[SYS_kill]    sys_kill,
[SYS_exec]    sys_exec,
[SYS_fstat]   sys_fstat,
[SYS_chdir]   sys_chdir,
[SYS_dup]     sys_dup,
[SYS_getpid]  sys_getpid,
[SYS_sbrk]    sys_sbrk,
[SYS_sleep]   sys_sleep,
[SYS_uptime]  sys_uptime,
[SYS_open]    sys_open,
[SYS_write]   sys_write,
[SYS_mknod]   sys_mknod,
[SYS_unlink]  sys_unlink,
[SYS_link]    sys_link,
[SYS_mkdir]   sys_mkdir,
[SYS_close]   sys_close,
};

syscalls 应该被解读成:

  1. array of
  2. pointers to
  3. functions of no arguments
  4. returning uint64

4. 参考资料

C Programming: A Modern Approach, 2/e


<<:  JavaScript Day10 - 函式

>>:  【Day09】列表 List 与 key

Day18 测试写起乃 - Cucumber 前置作业

写Cucumber之前,先了解何谓 BDD(Behaviour-Driven Development...

四个可以帮助你找回 iPhone/iPad 上遗失的照片影片的实用方法

我们经常会因爲种种问题误删了我们iphone里的照片或者影片。这篇文章我们将分享四个可以帮助你找回遗...

[Day23] swift & kotlin 游戏篇!(5) 小鸡BB-游戏制作-Tab功能分页

游戏示意 swift - tab功能分页 游戏页面排完版了 接下来就建立下方蓝色的分页吧 分页的功能...

[Day 10] Sass - Values

Values 有写过任何一门程序语言的应该都知道,对於每个变数的值来说都会有其对应的资料型态,而在S...

Kotlin Android 第18天,从 0 到 ML - View Binding

前言: 在Activity 和 Fragment 只要操作 xml 的元件,在 onCreate 时...