• 締切済み

なぜポインタという概念が誕生したの?

C言語には「ポインタ」という概念がありますが、そもそもなぜ「ポインタ」という概念が生まれたのですか? 「ポインタ」という概念が生まれた背景は何なんでしょうか? 当時、メモリの性能が貧弱だった為、それを有効に活用する為に生まれたのでしょうか? それに、「ポインタ」という概念がないとどうなるのでしょうか? 回答のほうよろしくお願いします。

みんなの回答

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.11

アドレッシングレジスタ自体がポインタなのは、CPU内に極小のレジスタしかなく、RAM上のデータを指す必要があるからです。 ポインタという概念がなければデータを番地情報として代わりに持つことができないため、重複するデータを一つにまとめられず、常に実体を持つ必要が出てきます。 例えるなら住民票をバイト先に提出する必要があるときに、バイト先の内部で「連絡先情報」「保険用情報」といった具合に用途毎枚数をバイト君に提出要求するような事になります。 バイトの個人情報はここの引き出しに原本が入っているという、指す情報として扱えませんから。 用意する数が増える事の無駄はコンピュータ内部ではコピー回数の増加になり、メモリーバスのビジー率が上がってパフォーマンスが落ち、RAMの消費率が上がります。 それにしても他に投稿された同様の質問を読む限り、コンピュータの事をあまりにもわかっていないように見受けられます。

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.10

CPUが持つアドレッシングレジスタ自体がポインタだからです。

  • chachaboxx
  • ベストアンサー率23% (412/1777)
回答No.9

ポインタの機能は住所のGPS座標と同じです。場所を管理する最も単純な方法です。 GPS座標では直感で地域が判りにくいですが、住所情報で飛行計画を作るのも判りにくいです。 速度はアルゴリズム次第だと思います。 ポインタを使わないメモリーアクセスの方が一般的です。

  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.8

C言語を高級言語だと思うと「ポインタの概念が生まれた」とか勘違いします。 C言語は「高級マクロアセンブラ」です。 インデックスの間接参照はアセンブラでは普通に使う方法です。 アセンブラを理解しているとC言語の便利さに感激しますよ。

  • hahaha8635
  • ベストアンサー率22% (800/3609)
回答No.7

アセンブラをやってるとわかりますが メモリーの物理番地を入れるところです これにより相対的にメモリアクセスができます http://www9.plala.or.jp/sgwr-t/c/sec10-2.html

  • tukuneto
  • ベストアンサー率26% (12/45)
回答No.6

語弊がある気もしますが、ざっくり説明で。 まず、メモリがあります。 メモリも区画に分かれて、データを入れておきます。 その番地がポインタです。 しかし、ポインタの番地を指定して、データを入れるのは、わかりにくいです。 なので、変数というものが、作られました。 ということではないのかね? 番地指定じゃわかりづらいから、分かりやすいラベルを付けよう!って、発想な気がするなー。

  • notnot
  • ベストアンサー率47% (4835/10236)
回答No.5

もともとは、アセンブラ(マシン語)での概念です。 演算、代入、参照、ポインタ、値、配列、添え字、文字型、整数型、浮動小数点型、などなど。 アセンブラで出来ていたことをCでも出来るようにしようとすると、ポインタが必要です。 ポインタが明示的にない言語でも、ポインタの概念がないと理解できないことが多いです。

noname#252929
noname#252929
回答No.4

そんなにポインタが難しいですか? これが難しいといっていれば、Cは無理かと思いますが。 ストラクチャや、ストラクトタグなんて、壊滅的じゃないでしょうか。 そもそも、ポインタの概念なんか、CPUの基本動作のところから使われているものなのだから、ソフトウエアを組む人なら、当然のように理解しているものだと思いますけどね。 ポインタがないとどうなるのか?より、ポインタがどのように使われているのか?を理解されたほうが早いと思いますよ。

  • hiodraiu
  • ベストアンサー率15% (445/2809)
回答No.3

ポインタが必要だったからです。 C言語は一般的な高級言語と違い、組み込み用途にも使える言語です。 それが何故出来るのかといえば、メモリー空間に直アドレスでアクセス出来るからです。 CPUによっては、メモリとI/Oのアドレス空間が同じものがあります。この場合、I/Oを使用するためには、ポインター変数の存在が必須になります。 ところでポインタって「概念」ですか?

回答No.2

概念というより、技術ですね。「関数」を作る上での。 プログラミング言語は数多ありますが、変数とそのスコープ(使用可能範囲)というものは、特にその言語を特徴づけるものです。C言語は、当時マイクロソフトのBASICなどがほとんどスコープらしい概念がないところ、特に厳格なスコープが決められていて、多くのパソコンプログラマに評価されてました。その一方で、関数の引数には値しか渡せず、変数を渡すことが出来なかったわけです。 で、変数を渡すのではなく、変数の在処を示す値(ポインタ)を渡すことで、変数の中身を操作するという技術が編み出され、実装されていたわけです。 ですから、ポインタがなかったら、関数はすべて戻り値で処理するしかなくて、えらいことになったですよ。 今の、参照渡しアタリマエの若い方にはわからんかもしれんですが、ポインタ渡しはその原型で、むしろ基本なんです。まぁ、年寄りの昔話ということで。

関連するQ&A

  • ポインタについて

    C言語のポインタの宣言の仕方についての質問です。お詳しい方どうかご回答よろしくお願いいたします。 (1)char *p; (2)char* p; 上記2つの宣言はどう違うのでしょうか??(同じものなのでしょうか??)メモリの確保の仕方などに違いがあるのでしょうか?? また、この両者はどのように使い分ければ良いかなどお教えください。 よろしくお願いいたします。

  • 【なぜポインタを使うのか】

    私は、ポインタのメリット・デメリットを以下のように考えています。 ◆メリット メモリを多く確保しなければならないオブジェクトについて、コピー処理を行うことなく省メモリでインタフェースできる。 ◆デメリット ・関数内でしか使用しない非ポインタのローカル変数に比べ、  アクセス可能な場所が多くなってしまい、色んな箇所から値が変更されうる。(影響範囲の限定がしずらい) ・可読性が低くなる。(若いエンジニアはCの経験者は少なくっていくと思われるため、保守コストが若干割高になる) そのため、よっぽどメモリを多く使うようなオブジェクトでなければ、 (もしくは速度を重視する必要があるプログラムでなければ) 値渡しにしても良いのではと考えています。 しかし、度々目にするソースは、何でもかんでもポインタで処理しているものも多々見受けられます。 特に、int型のようなメモリを大量に使用しないものでも、ポインタで変数宣言しているケースもよく見ます。 なぜなのでしょうか? (熟練のC言語プログラマが、昔ながらの記述を踏襲しているというのはあるのかなと考えていますが)

  • ポインタ

    c言語のポインタの意味がさっぱりわかりません。プロの方に聞いても「住所」っていうだけで自分ではなんじゃそりゃ!って感じです。「*」と「&」の意味もよくわからなく… だれかよろしくお願いいたします

  • 「ポインタ」とはそんなに素晴らしいものなの?

    どこかの書籍に記載されていたのですが、 >「ポインタ」は魅力があるすばらしいものだ。 上記の一文が掲載されていたのですが、こんな難しい概念。どこが素晴らしいものなんですか? こんなものに絶賛するのは本を執筆した著者だけだと思いますが、どうなんでしょうか? プログラマーの方、感想及び回答のほうお願いします。

  • ポインタのミスでOS壊れるのでしょうか?

    c言語の開発環境VC++を持っていますがポインタの処理で間違いそうで なかなかコードのケアレスミスが怖くてポインタやmallocを含んだコードを実行できないでいるのですが、そもそもポインタやmallocのコードミスでOSが壊れてos再インストールなどに陥るものなのでしょうか?保護違反などが出てきてパソコン再起動なんかが起こるのでしょうか?

  • ポインタの宿題が解けません。

    C言語でポインタを勉強しているのですが、 char型のアドレス:0022FF47 int型のアドレス:0022FF40 が今あるとして、 このアドレスのメモリの中身はどんな状態になっていますでしょうか? visual studioのwatch で見る以外の方法で分かりましたらお願いします。

  • int型のポインタ

    int型のようなメモリを大量に使用しないものでも、ポインタで変数宣言しているのをよく見かけますが、 なぜでしょうか? 私はCに慣れていないため、int型くらいのサイズだったら、なるべくならポインタを使わないで書いてもらった方が可読性が良いので、ポインタにするメリットがあまり感じられません。

  • C++言語のポインタについて

    現在、C++言語を学習しているのですが、 ポインタを使わない、 int main() { Human human; human.Introduction(); } と、ポインタを使った、 int main() { Human *p; p = new Human; p->Introduction(); delete p; } があります。どちらも同じ動作をしますが、ポインタを使ったものがよく使われているのは、 メモリの節約?動作速度?のためなのでしょうか? なぜ使われるのか教えてください。

  • ポインタはどんな時に使うものなの?

    僕は最近C++の勉強をしている高校生です。 さっそくですが質問です。最近、ポインタを覚えました。 ポインタはメモリの番地を指定できるから低レベル処理に使えると聞きましたが その他ではいったい何に使えるのか想像がつきません。 具体的にどんな処理に使うのでしょうか? お暇があればご回答ください。

  • なぜ「C言語」にOOPが実装されなかったの?

    1972年に開発された「C言語」(C++ではない)には「オブジェクト指向」というのがないのですが、なぜ「C言語」に「オブジェクト指向」というのが実装されなかったのですか? 「オブジェクト指向プログラミング」は1960年代後半に登場していたのですが、後発の「C言語」には「ポインタ」はあっても「オブジェクト指向」というのがありません。なぜ「オブジェクト指向」は実装されなかったのでしょうか? 当時コンピュータの性能が低かったため実装が難しかったことと、まだ当時オブジェクト指向自体が無名だった為、「C言語」の開発者自体も知らなかったということもあるのでしょうか?