递增整数指针将按整数大小增加地址。 如果我们增加一个函数指针会发生什么?
答案 0 :(得分:9)
就像void *
指针和指向不完整类型的指针一样,指向函数的指针不允许运算。
例如,关于Additive运算符的C99§6.5.6说:
另外,两个操作数都应具有算术类型或一个 操作数应该是指向对象类型的指针,而另一个应该具有 整数类型。 (递增相当于添加1.)
函数类型不是对象类型,因此将函数指针作为+
运算符的操作数提供是违反此约束的。
作为C语言的扩展,GCC编译器允许对函数指针进行算术运算(以及指向void
的指针)。它实现了这一点,就好像指向对象的大小为1.请注意,在符合标准的模式中,它会对此类代码发出警告。
答案 1 :(得分:4)
void和函数指针不允许使用指针arithematic 然而,许多编译器通过编译器扩展支持指针arithematic。 这是通过将空白或函数的大小视为1来完成的。
如果您正在使用gcc,请使用以下标志强制编译器提供诊断:
-Wpointer-arith