9

整数ポインタをインクリメントすると、アドレスが整数のサイズだけ増加します。関数ポインタをインクリメントするとどうなりますか?

4

2 に答える 2

8

void *ポインタや不完全型へのポインタと同様に、関数へのポインタでは算術演算は許可されていません。

たとえば、加算演算子に関する C99 §6.5.6 は次のように述べています。

加算の場合、両方のオペランドが算術型を持つか、一方のオペランドがオブジェクト型へのポインターで、もう一方が整数型でなければなりません。(増加は 1 を追加することと同じです。)

関数型はオブジェクト型ではないため、演算子のオペランドとして関数へのポインターを提供すること+は、この制約に違反します。


C 言語の拡張機能として、GCC コンパイラは、関数へのポインター (および へのポインターvoid) の算術演算を許可します。これは、ポイント先のオブジェクトのサイズが 1 であるかのように実装します。標準準拠モードでは、そのようなコードに対して警告が発行されることに注意してください。

于 2012-10-31T06:10:27.293 に答える
3

void および関数ポインターでは、ポインター算術は使用できません。
ただし、コンパイラの多くは、コンパイラの拡張機能を介してポインター算術をサポートしています。これは、ボイドまたは関数のサイズを 1 として扱うことによって行われます。

gcc を使用している場合は、次のフラグを使用して、コンパイラに診断を強制的に提供させます。

-Wpointer-arith 
于 2012-10-31T06:20:52.807 に答える