1

関数のアドレスのサイズはコンパイルタイプでわかりませんか?

4

3 に答える 3

7

ポインターに対する算術演算は、ポインターを特定の型のオブジェクトの配列として扱います。したがって、 に 3 を加えると、int *3 秒進みますint

関数ポインターは、何かの配列として解釈することはできません。指示、かもしれないし、そうでないかもしれません。一部のマシンには、命令用に別のアドレス空間があります。一部のマシンには、可変長命令があります。

余談ですが、関数のサイズはコンパイル時にわかりますが、それはコンパイラが作業を終了した後でのみです。関数のサイズをそれ自体にコンパイルすることは、アセンブリ言語ではトリッキーになる可能性があります。アセンブリ言語は、そのような構造を形成する唯一のプログラミング方法です。

于 2013-01-24T14:45:34.423 に答える
1

関連するポインターに対してのみ演算を実行できます。たとえば、そのバッファーの異なる位置への複数のポインターを持つバッファーがある場合、それらのポインターに対して算術演算を実行できます。ただし、異なるバッファーを指す 2 つのポインターなど、関連のない 2 つのポインターに対してポインター演算を実行しようとすると、未定義の動作になります。

関数ポインタは、同じ関数への別のポインタ以外には関連付けることができません。

于 2013-01-24T14:45:42.707 に答える
-2

C では、関数ポインターで算術演算を許可または定義していません。こちらをご覧ください。これは、関数ポインタに対して加算および減算操作を行うときに、コードのどこに到達するかが定義されていないためです。異なるハードウェア アーキテクチャ用に同じ C コードをコンパイルしていると考えてください。関数ポインタをインクリメントまたはデクリメントすると、プラットフォーム間で一貫性のないコード (または命令) の完全に異なる部分を指す可能性があります。

于 2013-01-24T14:47:00.123 に答える