C言語関係掲示板

過去ログ

No715 iの時と&iの時とでの意味の違い

[戻る] [ホームページ]
No.8600

fwrite()関数について
投稿者---htake(2003/07/23 23:57:55)


(例1)
char i[] = { 1 , 2 , 3 , 4 , 5 , 6 };
fwrite(&i , sizeof(char) , 6 , stdout);

(例2)
char i[] = { 1 , 2 , 3 , 4 , 5 , 6 };
fwrite(i , sizeof(char) , 6 , stdout);

上の2つの例ですが
変数i が i の時と、&iが、本、ホームページの例によっては書き方が違っているのですがどちらが正しい記述方法なのでしょうか。結果は同じになります。iの時と&iの時とでの意味の違いについて教えていただけると助かります。

No.8601

Re:fwrite()関数について
投稿者---YuO(2003/07/24 00:48:59)


>変数i が i の時と、&iが、本、ホームページの例によっては書き方が違っているのですがどちらが正しい記述方法なのでしょうか。結果は同じになります。iの時と&iの時とでの意味の違いについて教えていただけると助かります。

fwriteの結果は一緒になると思いますが,例1は違和感があります。
iと&iは別物ですから。

char i[6];
があったとき,部分式
i
は,sizeof演算子と単項&演算子のオペランドになる場合を除いて,
&i[0]
という扱いになります。つまり,
・配列型を持つ式は,原則「配列の先頭要素へのポインタ」として扱われる
ことになります。
この場合,iはchar *型(pointer to char)を持ちます。

それに対して,部分式
&i
は,上記例外にあてはまり,「配列iへのポインタ」を作り出します。
&iはchar (*)[6]型(pointer to array [6] of char)の式であり,
単なるiの場合(char *)とは異なります。


なので,
fwrite(i, sizeof(char), 6, stdout);
は,「配列iの最初の要素から6個分をstdoutに書き込む」と読めます。また,
fwrite(&i, sizeof(i), 1, stdout);
であれば,「配列iをstdoutに書き込む」と読めます。

今回の場合,例1では
fwrite(&i, sizeof(char), 6, stdout);
となっていて,「何がやりたいのか」を正確に記述していません。
#それで違和感が生じた


No.8627

Re:fwrite()関数について
投稿者---htake(2003/07/24 22:12:55)


ありがとうございました。
ポインタについて理解が不透明でした。
また、質問させていただくときはお願いいたします。