資料集
ここはhideyosiの学習帳です。いろいろな資料を集めたり整理したりしています。オイラ用のノートなので間違っていたり未完成だったりしますので信用度は相当低いことをあらかじめご了承くださいませ。
8: 2007-03-23 (金) 12:36:55 ソース バックアップ No.8 を復元して編集 9: 2007-03-23 (金) 20:17:58 ソース バックアップ No.9 を復元して編集
Line 364: Line 364:
*現実の型キャスト(ポインタ) [#j3516d0b] *現実の型キャスト(ポインタ) [#j3516d0b]
 +これは「現実」とは言っても、ほぼ概念通りと考えてもらってかまわないと思います。
 +
 +アドレス変数(ポインタ)は特別にして唯一無比の型なので、とにかくこれに代入しようとした場合はほぼ''かならず型キャストして代入する''で問題ないでしょう。
 +
 +-COLOR(blue){少ない桁数の変数から型キャストした場合どうなるのか?}
 +
 +こういうのは実験しちゃうのが早いですよ?
 +
 + int main(void){
 +
 +  char *p;
 +  char c;
 +
 +  c = 0x33;
 +  p = c;
 +
 +  printf("data is 0x%X\n",p);
 +
 +}
 +
 +さて、これをコンパイルすると・・・
 +~おっと!いけない!型キャストを忘れていました。
 +
 + int main(void){
 +
 +  char *p;
 +  char c;
 +
 +  c = 0x33;
 +  p = (char *)c;
 +
 +  printf("data is 0x%X\n",p);
 +
 +}
 +
 +・・・実は、これもエラーが出ます。「キャストはいいけどサイズが合わんぞ。サイズくらい合わせろよ!」ってとこでしょうか?
 +
 +しかし警告エラーは無視してコンパイルし、これを実行すると、答えは0x33と表示されます。おそらくこういう場合、足りないケタ数は0で埋められてしまうようです。
 +
 +では、char型の変数の値をアドレス変数に当て込むにはどういう手法が正しいのでしょうか?
 +
 +正しい呼び名はわかりませんが、おそらくこういう「二段キャスト」でよいはずです。
 +
 +  p = (char *)(int)c;
 +
 +COLOR(blue){上記。理解のため無理にchar型を使っていますが、やっぱり理想は、せめてint型にしてから、あるいはアドレス変数への代入が予想されるような値は最初からint型で定義して使うというのが本流なのでしょう。きっと。}


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 59315, today: 1, yesterday: 0