雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、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型で定義して使うというのが本流なのでしょう。きっと。}