Cの初心者として、ポインタをキャストしても実際に問題がないかどうかについて混乱しています。
私が理解しているように、ほとんどすべてのポインター型を他の型にキャストすることができ、コンパイラーはそれを可能にします。例えば:
int a = 5;
int* intPtr = &a;
char* charPtr = (char*) intPtr;
ただし、一般に、これは未定義の動作を引き起こします(ただし、多くのプラットフォームで機能します)。とはいえ、いくつかの例外があるようです。
void*
自由に行き来できます(?)char*
自由に行き来できます(?)
(少なくとも私はそれをコードで見ました...)。
では、ポインタ型間のキャストはどれがCの未定義動作ではないのでしょうか?
編集:
C標準( http://c0x.coding-guidelines.com/6.3.2.3.htmlのセクション「6.3.2.3ポインター」)を調べてみましたが、についてのビットを除いて、実際には理解していませんでしたvoid*
。
Edit2:
明確にするために:私は明示的に「通常の」ポインターについてのみ質問しています。つまり、関数ポインターについては質問していません。関数ポインタをキャストするためのルールは非常に制限されていることに気づきました。実際のところ、私はすでにそれについて質問しました:-):関数ポインターをキャストし、パラメーターの数を変更するとどうなりますか?