C言語を習得するのに欠かせない**「ポインタ」という概念**
「ポインタ」は難しくて、挫折者も多く、
ポインタの話で一冊本が書けてしまうほど奥が深く難しい概念でありますが、そもそもなぜ「ポインタ」という概念が生まれたのですか?
ポインターという概念がないとどうなるのでしょうか?
アセンブラ言語の欠点を解消する為にそういう概念が生まれたのでしょうか?
回答のほうよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/17 19:29
回答6件
0
「ポインタ」は難しくて、挫折者も多く、
ポインタの話で一冊本が書けてしまうほど奥が深く難しい概念でありますが、そもそもなぜ「ポインタ」という概念が生まれたのですか?
発想が逆です。CPUレベルで考えると、値を参照するのも、ポインタという「値」で行っています。
C言語やC++ではそのポインタを直接プログラマーに見せていますが、他の多くの高級言語では、変数参照は内部にとどめて、直接ポインタを考慮しなくてもいいようにしてあるのです。
投稿2019/05/17 03:56
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C 言語で言うポインタを経由するアクセスとは、アセンブリレベルで言うと「レジスタ間接アドレッシング」です(レジスタの値をアドレスと見なして、そのアドレスに対してアクセスする)。
配列アクセスはインデックス付きレジスタ間接アドレッシングですね。
アセンブリで必須のこのアドレッシングを、素直に C 言語で対応させた物がポインタ(point=場所を指し示すもの)です。
C は逆に、「アセンブリレベルのことも書ける」ように、ポインタを使っています。
C のポインタが難しい、というのは、CPU の挙動を知らないままに、高級言語としての C を最初に触った人が陥る落とし穴です。逆にそれらの知識がある人にとっては、ポインタは何も難しいことがないのです。
投稿2019/05/17 05:02
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
なぜ「ポインタ」という概念が生まれたのですか?
ポインタというのはレジスタ間接アドレッシングですから、レジスタ間接アドレッシングが生まれたのはなぜかとなると、こちらが分かりやすいです。
メモリアドレス
一言で言うと、「アドレスに対して計算できると便利」だからです。
例えば配列やスタックといった構造はアドレスに対して計算することで存在するものです。
アセンブラ言語の欠点を解消する為にそういう概念が生まれたのでしょうか?
いいえ、アセンブリ言語、というか機械語、CPUのアーキテクチャの段階で既に存在した概念です。
ポインターという概念がないとどうなるのでしょうか?
レジスタ間接アドレッシングを無くすと、
配列や構造体は使えなくなり、ローカル変数とグローバル変数の区別が無くなるので関数への再入もままならなくなり、まともなプログラムを書くことがほぼ不可能になります。
(それとも「ポインタ」という名前で使われるレジスタ間接アドレッシングのみを禁止するのでしょうか。名前で分けるのはあまり意味のある議論とは思えません。)
投稿2019/05/17 13:01
総合スコア3047
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「ポインタ」は難しくて、挫折者も多く
それは現在の教育側に問題が有るように思います。
CPU(アセンブラ?)の機能について何も語らずに、アドレスという観念すら教えずに、プログラム言語を教えるからではないでしょうか?
そのままコーディングすればちゃんと動くプログラムを作らせて、デバッグもちゃんと教えない。
で、アセンブラで言う所の68Kなら、move.w (A0),d0・・・みたいな・・・間接参照があってそれを言語に取り入れたのがポインタです。
投稿2019/05/17 04:14
編集2019/05/17 07:27総合スコア6851
0
主記憶装置(メモリー)を使う上で有効だからです。
高級言語における変数代入や参照は、主記憶装置の利用手続きを表現したものです。いうまでもなく、主記憶装置のアクセスは整数値で番地を指定し、そこにバイト値を書いたり読んだりします。
C言語でのポインタは、主記憶装置の番地情報用に使われる変数の型です。
投稿2019/05/17 17:50
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。