関数のアドレスのサイズはコンパイルタイプでわかりませんか?
3 に答える
ポインターに対する算術演算は、ポインターを特定の型のオブジェクトの配列として扱います。したがって、 に 3 を加えると、int *
3 秒進みますint
。
関数ポインターは、何かの配列として解釈することはできません。指示、かもしれないし、そうでないかもしれません。一部のマシンには、命令用に別のアドレス空間があります。一部のマシンには、可変長命令があります。
余談ですが、関数のサイズはコンパイル時にわかりますが、それはコンパイラが作業を終了した後でのみです。関数のサイズをそれ自体にコンパイルすることは、アセンブリ言語ではトリッキーになる可能性があります。アセンブリ言語は、そのような構造を形成する唯一のプログラミング方法です。
関連するポインターに対してのみ演算を実行できます。たとえば、そのバッファーの異なる位置への複数のポインターを持つバッファーがある場合、それらのポインターに対して算術演算を実行できます。ただし、異なるバッファーを指す 2 つのポインターなど、関連のない 2 つのポインターに対してポインター演算を実行しようとすると、未定義の動作になります。
関数ポインタは、同じ関数への別のポインタ以外には関連付けることができません。
C では、関数ポインターで算術演算を許可または定義していません。こちらをご覧ください。これは、関数ポインタに対して加算および減算操作を行うときに、コードのどこに到達するかが定義されていないためです。異なるハードウェア アーキテクチャ用に同じ C コードをコンパイルしていると考えてください。関数ポインタをインクリメントまたはデクリメントすると、プラットフォーム間で一貫性のないコード (または命令) の完全に異なる部分を指す可能性があります。