9

递增整数指针将按整数大小增加地址。如果我们增加一个函数指针会发生什么?

4

2 回答 2

8

就像void *指针和指向不完整类型的指针一样,在指向函数的指针上不允许进行算术运算。

例如,关于加法运算符的 C99 §6.5.6 说:

另外,两个操作数都应具有算术类型,或者一个操作数应是指向对象类型的指针,而另一个应具有整数类型。(递增相当于加 1。)

函数类型不是对象类型,因此提供指向函数的指针作为运算符的操作数+违反了此约束。


作为 C 语言的扩展,GCC 编译器允许对指向函数的指针(和指向 的指针void)进行算术运算。它实现这一点,就好像指向对象的大小为 1。请注意,在符合标准的模式下,它会针对此类代码发出警告。

于 2012-10-31T06:10:27.293 回答
3

在 void 和函数指针上不允许指针算术。
然而,许多编译器通过编译器扩展支持指针算术运算。这是通过将 void 或函数的大小视为 1 来完成的。

如果您使用 gcc,则使用以下标志强制编译器提供诊断:

-Wpointer-arith 
于 2012-10-31T06:20:52.807 回答