3.10 函数地址
一旦函数被编译并载入计算机中执行,它就会占用一块内存。这块内存有一个地址,因此函数也有地址。
可以通过指针使用函数地址,就像可以使用变量的地址一样。函数指针的声明和使用初看起来有点模糊,但是它同语言其余部分的格式一致。
3.10.1 定义函数指针
要定义一个指针指向一个无参无返回值的函数,可以写成:
当看到像这样的一个复杂定义时,最好的处理方法是从中间开始和向外扩展。“从中间开始”的意思是从变量名开始,这里是指funcPtr。“向外扩展”的意思是先注意右边最近的项(在这个例子中没有该项,以右括号结束),然后注意左边(用星号表示的指针),注意右边(空参数表表示这个函数没有带任何参数),再注意左边(void指示函数没有返回值)。大多数声明都是以右-左-右动作的方式工作的。
回过头来看,“中间开始”(“funcPtr是一个……”),向右边走(没有东西,被右括号拦住了),向左边走并发现一个‘*’(“……指针指向一个……”),向右边走并发现一个空参数表(“……没有带参数的函数……”),向左边走并发现一个void(“funcPtr是一个指针,它指向一个不带参数并返回void的函数”)。
读者可能感到奇怪为什么*funcPtr需要括号。如果不使用括号,编译器会看到:
这可能是在声明一个函数(返回一个void)而不是定义一个变量。在了解一个声明和定义应该是什么的时候,可以想象编译器要经历同样的过程。所以要“遇到”这些括号,使得编译器会返回左边并发现‘’,而不是一直向右发现一个空参数表。