- ベストアンサー
ポインタに ~0を入れること
見かけたCのプログラムで、 ポインタに~0を代入するものを見ました。 そのプログラムをそのまま載せるのはわかりにくいので、 代わりに以下のプログラムを作って実行しました。 #include <stdio.h> int main(void) { char *pa[3]; int i; pa[0]=0; pa[1]=~0; pa[2]="Hello"; printf("sizeof(char*)=%d\n", sizeof(char*)); for(i=0; i<=2; i++) { if(pa[i]==NULL) printf("pa[%d] はNULLです。\n", i); if(pa[i]==(char*)0xFFFFFFFF) printf("pa[%d]は全ビット1です。\n", i); if(pa[i]==~0) printf("pa[%d]は~0です。\n", i); } return 0; } 結果 sizeof(char*)=4 pa[0] はNULLです。 pa[1]は全ビット1です。 pa[1]は~0です。 このプログラムはコンパイル時にエラーも警告も出ず、 動作も意図したとおりです。 pa[1]に入っている ~0 は、int型の定数なのでしょうか。 それならば、 pa[1]=~0; という代入や if(pa[i]==~0) という比較は 左辺はchar*型で右辺はconst int型であって型が異なりますが、 問題ないのでしょうか。 ~0は0の否定なので、全ビットは1なのでしょうけど、 int型(の定数)だと思います。 ~0というのは何か特別な値なのでしょうか。 ポインタに~0を入れるというのは、意味があるのでしょうか。 (例えば、「ポインタに0を入れるということは、ヌルポインタであって、ポインタとして無効なんですよ」のようなこと。)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
その他の回答 (2)
- VanillaTea
- ベストアンサー率52% (13/25)
- mojimojio
- ベストアンサー率51% (14/27)
お礼
みなさんありがとうございました。 7月26日22時過ぎに締め切りました。
補足
丁寧にご説明いただきありがとうございます。 >char *p として p = NULL, p-- ならば保証できますが 私はこのようなことを考えもしたことなかったです。 =========================== ご回答を読んで、以下のプログラムを作ってみました。 私の環境では、コンパイル時にエラーも警告も出ないです。 (他の環境では違うんでしょうね。) #include <stdio.h> #include <limits.h> int main(void) { char *pa[3]; int i; printf("CHAR_BIT=%d\n", CHAR_BIT); printf(" sizeof(char*)=%d\n sizeof(int)=%d\n", sizeof(char*), sizeof(int) ); pa[0]=NULL; pa[1]=NULL; (pa[1])--; pa[2]=(char*)-1; for(i=0; i<=2; i++) { if(pa[i]==NULL) printf("pa[%d] はNULLです。\n", i); if(pa[i]==(char*)0xFFFFFFFF) printf("pa[%d]は全ビット1です。\n", i); if(pa[i]==~0) printf("pa[%d]は~0です。\n", i); } return 0; } 結果 CHAR_BIT=8 sizeof(char*)=4 sizeof(int)=4 pa[0] はNULLです。 pa[1]は全ビット1です。 pa[1]は~0です。 pa[2]は全ビット1です。 pa[2]は~0です。