› ちゆきの懸想文 › 徒然に・・・ポインタと絶対アドレスの違い(C言語)

2011年03月09日

徒然に・・・ポインタと絶対アドレスの違い(C言語)

 シバケンの天国の『みんながパソコン大魔神』掲示板への投稿の転載です。



2011/03/08 (Tue) 10:24


 これを混同している人が非常に多いです。

 バイト・アドレシング、1バイト=8ビット、1ショート・インテジャー=1バイト、1インテジャー=2バイト、1ロング・インテジャー=4バイトのマシンを仮定します。
 絶対アドレスは、バイト単位ですから、1を加えると1増えて次のバイトを指します。
 「ショート・インテジャーを指すポインタ」に1を加えると、次のバイトを指し、絶対アドレスと同等です。但し、アドレスではないので、「1増えた」とは言いません。
 「インテジャーを指すポインタ」に1を加えると、次の2バイトを指します。絶対アドレスは2増えます。
 「ロング・インテジャーを指すポインタ」に1を加えると、次の4バイトを指します。絶対アドレスは4増えます。
 「『12バイトからなる構造体』を指すポインタ」に1を加えると、次の『12バイトからなる構造体』を指します。絶対アドレスは12増えます。
 「a」がポインタだとすると、そのポインタが指してる中身は「*a」と表記します。「*a」の実体は、1バイトかもしれませんし2バイトかもしれませんし4バイトかもしれませんし12バイトかもしれません・・・ポインタ「a」がどんなオブジェクトを指しているかによって違うのです。
 ポインタと絶対アドレスの違いの“さわり”をご理解いただけたでしょうか。

 『ポインタ』はC言語入門の最初の関門でして、分かってみれば簡単ですが、此処で躓く人が凄く多いです。


 尚、インテジャーが16ビットのマシンもあれば32ビットのマシンもあります。インテジャーはそのマシンで「最も自然な単位」なのです。実際には、同じマシンでも「Cコンパイラ」が違うと、違うことが有ります。勿論、インテジャーとロング・インテジャーが同じ長さのことも珍しくありません。

 ソフトウェアを書くときには、インテジャーが16ビットでも32ビットでも更に長くても大丈夫なようにするのが、C言語流です。
 「C言語は移植性が良い」と誤解されますが、そんなことはなく、「C言語流」で書かれたソフトウェアだけが移植性が良いのです。

 明確な取り決めはないです(今はあるかもしれません)が、ショート・インテジャーは8ビット以上、インテジャーは16ビット以上、ロング・インテジャーは32ビット以上を前提として書かれてるソフトウェアが多いです。
 尚、インテジャーがショート・インテジャーより短くはない、ロング・インテジャーがインテジャーより短くはない、とは決まっています。


 C言語は、ハードウェアを直接操作したりする記述には向いてますが、ソース・コードを読んだときに誤りに気付きにくいので、一般のアプリケーション・ソフトウェアなどを書くには勧めません。
 UNIXのアプリケーション・ソフトウェアの多くがC言語で書かれてるのは、当初はUNIX上で動く「高級言語」のコンパイラが無かったからと、UNIXカーネル(OS中核部)と作者が同じだったからに、過ぎません。

 C言語は、エキスパートの手に掛かれば生産性が高いですが、アベレージ・プログラマが使うとデバグに手間取って「高級言語」より生産性が落ちますし出来上がったソフトウェアの品質も低くなりがちです。

 一般のソフトウェアはPascalなどの「高級言語」で書きましょう。
 高級言語の中でどれが優れてるかについては、敢えて、本稿では言及せずに置きます。但し、自分でその言語でプログラミングしたことがない人が言うことは、信用してはいけません。

 C言語に限りませんが、30年ぐらい前に、かのP.J.プラウガー氏に会ったときに「良いプログラマを育成するにはどうしたら良いか」と片言の英語で聞いたら、即座に「良いプログラマの隣に座らせて置くことだ」と返ってきました。
 本を見て独学で勉強する以外の方法がない人は多い(私もそうだった)ですが、出来れば良いプログラマに付いてください。
 無理なら、次善の策は、「良いプログラム」を徹底的に読むことです。前述のP.J.プラウガー氏などが書かれたプログラム例を暗記するほど頭に叩き込みましょう。


 こんな文章、喜ぶ人は居るのかしら。
 兎に角、試しに1本、書いてみました。



2011/03/09 (Wed) 00:46


 本稿の記述は、C言語のプログラムを書いたり読んだりする際には必須のものですが、UNIX系OSを単なるユーザとして使う際には必要の無いものです。

 何故本稿を書いたかというと、コンピュータ・アーキテクチャの基礎知識はあるがC言語をご存じない人に、UNIX内部の説明をするための前振りです。(UNIX内部の何を次に書くかは白紙ですが、何を書くにしても避けて通れないのがC言語のポインタなのです)
 従って、今後は、更に難しくなっていく予定でした。

 試しに1本、書いてみた次第ですが、UNIX内部の話を書いても、面白がる読者がいらっしゃらないなら、書くのをやめます。
 皆様、読みたいか不要か、レスください。



上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
徒然に・・・ポインタと絶対アドレスの違い(C言語)
    コメント(0)