第2種情報処理技術者試験 平成7年春 午後 問7
http://www.bohyoh.com/ITEE/C/1995A07.html
中盤の
「while (fgets( (char*)&rbuf , sizeof(ADR), fp )!= NULL ) 」
が読めません
(char*)&rbuf , sizeof(ADR), fp
ファイルポインタからsizeof(ADR)サイズの分だけ取り出した文字を変数(char*)&rbufにほおりこむ
これが自分なりの解釈です
ですが「(char*)&rbuf」が意味不明。。。
根本的に解釈が間違っているのだと思います
詳しくわかる方教えてください
No.1ベストアンサー
- 回答日時:
rbufはADR型の構造体です。
&rbufは、ADR型の構造体rbufの実体へのポインタです。
つまり「&rbuf」は「(ADR *)&rbuf」です。
fgetsの引数は「char *」「size_t」「FILE *」ですから
fgets(&rbuf,sizeof(ADR),fp)
と書くと「char *」であるべき引数に「ADR *」を渡す事になります。
すると、コンパイラは「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」って言って、エラーになります。
なので「&rbufはADR *じゃなくて、char *だと思ってくれ」と書く必要があります。それが「(char *)&rbuf」と言う書き方です。
これを「型キャスト」と言います。
以下の例を参考に、考えてみて下さい。
typedef struct {
(略)
} ADR;
(略)
union PTR {
char *char_ptr;
ADR *adr_ptr;
} ptr;
ADR rbuf;
(略)
ptr.adr_ptr = &rbuf;
(略)
fgets(ptr.char_ptr,sizeof(ADR),fp);
この例は、ADR *とchar *を共有する共用体「ptr」を使用し「rbufのポインタ」を「ADR *型のadr_ptr」で受け取り、そのポインタを「char *型のchar_ptr」で参照しています。
つまり「型キャストを使用しないで書くと、上記のように共用体を使うなど、面倒な事をしなきゃなんない」のです。
これが、型キャストを使えば、
typedef struct {
(略)
} ADR;
(略)
ADR rbuf;
fgets((char *)&rbuf,sizeof(ADR),fp);
だけで済んじゃうのです。
「型キャスト」だったんですね!
キャストという言葉自体頭から抜けていました。。。論外ですねっ。
「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」
この説明が一番わかりやすかった!!!
ありがとうございます♪
No.3
- 回答日時:
C言語の場合、ある型へのポインタ型から別の型へのポインタ型へは暗黙的に型変換されます。
したがって、「(char*)&rbuf」のキャスト演算子がなくても意味は変わりません。(警告になることはあっても)エラーになることもありません。ただ、異なるポインタへの暗黙的な型変換は、多くの場合バグにつながります。そのため、本当に型変換したい場合は明示的にキャスト演算を行っているのです。また、C++ではこのような異なるポインタ型間の暗黙的な型変換は禁止されているので、それにならって明示的なキャストを行うことが多いのです。
そうなんです。
暗黙的了解で省略されているものが多すぎて参考書によって書き方が違ってくる。そこで混乱を自分の中で招いています。
常に省略なしで書くよう心がけていこうと思います
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Cの関数の引数のconst *charについて 5 2023/04/25 13:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- その他(データベース) 放送大学のデータベースの講義を、興味本位で見ていたら気になることがありました。 講師が、null を 5 2022/04/21 17:06
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列内の数字削除
-
SetWindowTextについて。
-
構造体が戻り値の関数について...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
new charとnew char[N]の違いは?
-
文字列str内の全ての数字を...
-
C言語において、以下の条件で...
-
strcat関数を自作したいです
-
ポインタを使用 [数字列を数値...
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
C言語で文字列をかえす正しい書...
-
文字の代入とコピーについて
-
小数点入りの文字列をfloat型に...
-
callocについて
-
'\\0'とはなんですか?
-
p = (char **)*p の意味
-
C言語を用いた環境変数の作成/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報