> 初めまして、九龍と申します。
> C言語でのプログラム経験は結構長いのですが、ある事が分からなかったので、
> C言語ポインタ完全制覇に購入させて頂きました。
はじめまして。お買い上げいただきありがとうございます。
> それで、現在読んでいる真っ最中なのですが、p303ページに記載されている
>「fは勝手にdoubleに読み替えられているので,当然正しく渡らないことになります.」
> の意味が分かりません。
> 上記は、仮引数float fは、double fと読み替えられているため、fのポインタを
>渡しても、void sub_func 関数では、floatへのポインタで間接参照されるため、
>正常に参照されないということでよろしいのでしょうか?
そうです…と答えると一言で終わってしまうわけですが、何か疑問があるので
質問されたのだと思います。そこをもう少し明確にしていただけると、何か回答
できるかもしれません。
たとえばfloat 4バイト、double 8バイトの処理系を仮定したとして、fは実は
doubleなので 8バイトです。その領域をfloat *で読めるはずはないわけです。
> 後、もし宜しければexternとリンケージに関する事も教えて頂ければと思います。
> p80の脚注にも出てきているので、ちょっとインターネットで調べてみたのですが
>(
http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide82-1.html)、見た瞬間に
>定義宣言と参照宣言、関数プロトタイプ宣言がごっちゃになりました。
そのページにあるように、外部結合とは、
| プログラムが複数のソースファイルから構成される場合,それらすべての
| ソースファイルにおいて同一のオブジェクト,或いは関数として参照。
ですよね? それに対し内部結合はそのソースファイルの中だけで有効なリンケージです。
関数や変数を内部結合にするためにはstaticを付けますが、
外部結合の場合、定義では何もつけず、宣言ではexternを付ける…と決まっていれば
説明が楽なのですが、実際には、
・どこかで定義されている変数を参照する場合、externを付けなくても、たいていの
処理系では何のエラーにもならない(p.317を参照)
・どこかで定義されている関数を使う場合、プロトタイプ宣言を行うが、
これにはexternをつけても付けなくても良い(で、たぶん普通はつけない)
ということで、説明がややこしくなっています。
> (なにせ今まで、どこかで定義宣言をしている変数を参照する場合には、
> externを付ければ良いぐらいにしか思ってなかったんで。)
この認識で正しいと思います。