使用との使用について質問がありintptr_t
ますlong int
。メモリアドレスのインクリメント(手動ポインタ演算など)はデータ型によって異なることを確認しました。たとえば、charポインタをインクリメントするとメモリアドレスに1が追加され、intポインタをインクリメントするとdoubleの場合は4、8、longdoubleの場合は16などが追加されます。
最初、私はこのようなことをしました:
char myChar, *pChar;
float myFloat, *pFloat;
pChar = &myChar;
pFloat = &myFloat;
printf( "pChar: %d\n", ( int )pChar );
printf( "pFloat: %d\n", ( int )pFloat );
pChar++;
pFloat++;
printf( "and then after incrementing,:\n\n" );
printf( "pChar: %d\n", (int)pChar );
printf( "pFloat: %d\n", (int)pFloat );
これは正常にコンパイルおよび実行されましたが、XCodeは、型キャストに対して「ポインターから異なるサイズの整数にキャストします」という警告を出しました。
いくつかのグーグルとビンビンの後(後者はまだ言葉ですか?)、私は何人かの人々が使用を勧めるのを見ましたintptr_t
:
#include <stdint.h>
..。
printf( "pChar: %ld\n", ( intptr_t )pChar );
printf( "pFloat: %ld\n", ( intptr_t )pFloat );
これは確かにエラーを解決します。だから、これからはポインタの型キャストに使うべきだと思ったのですが…でも、そわそわした後、次のように置き換えるだけでintptr_t
問題を解決できることがわかりました。int
long int
printf( "pChar: %ld\n", ( long int )pChar );
printf( "pFloat: %ld\n", ( long int )pFloat );
だから私の質問は、なぜintptr_t
有用なのか、そしていつそれを使うべきなのかということです。この場合は不要のようです。明らかに、メモリアドレスmyChar
とmyFloat
は大きすぎて収まりませんでしたint
...したがって、それらを型キャストしてlong int
問題を解決しました。
メモリアドレスが大きすぎることもありますlong int
か?今考えてみると、RAMが4GBを超える場合は可能だと思います。その場合、メモリアドレスは2 ^ 32-1(unsigned long intの最大値...)を超える可能性がありますが、Cはそれよりずっと前に作成されました。想像できますよね?それとも彼らはその先見の明がありましたか?
ありがとう!