質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

6回答

2690閲覧

なぜポインタという概念が生まれたのか?アセンブラの欠点を解消する為に生まれたのか?

mr0237

総合スコア164

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

2クリップ

投稿2019/05/17 03:47

C言語を習得するのに欠かせない**「ポインタ」という概念**

「ポインタ」難しくて、挫折者も多く
ポインタの話で一冊本が書けてしまうほど奥が深く難しい概念でありますが、そもそもなぜ「ポインタ」という概念が生まれたのですか?

ポインターという概念がないとどうなるのでしょうか?

アセンブラ言語の欠点を解消する為にそういう概念が生まれたのでしょうか?

回答のほうよろしくお願いします。

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/17 03:53

C言語について聞いているのに「C++」とタグがついてますが。
2ckD

2019/05/17 19:29

これだけ回答が出ても解決しませんか? まだ理解できないところはどこですか?
guest

回答6

0

「ポインタ」は難しくて、挫折者も多く、

ポインタの話で一冊本が書けてしまうほど奥が深く難しい概念でありますが、そもそもなぜ「ポインタ」という概念が生まれたのですか?

発想が逆です。CPUレベルで考えると、値を参照するのも、ポインタという「値」で行っています。

C言語やC++ではそのポインタを直接プログラマーに見せていますが、他の多くの高級言語では、変数参照は内部にとどめて、直接ポインタを考慮しなくてもいいようにしてあるのです。

投稿2019/05/17 03:56

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/05/17 03:58

アセンブラは機械語の逐語訳なので、CPUが値でメモリを参照する以上はアセンブラ上でもそうなります。
guest

0

C 言語で言うポインタを経由するアクセスとは、アセンブリレベルで言うと「レジスタ間接アドレッシング」です(レジスタの値をアドレスと見なして、そのアドレスに対してアクセスする)。
配列アクセスはインデックス付きレジスタ間接アドレッシングですね。

アセンブリで必須のこのアドレッシングを、素直に C 言語で対応させた物がポインタ(point=場所を指し示すもの)です。
C は逆に、「アセンブリレベルのことも書ける」ように、ポインタを使っています。

C のポインタが難しい、というのは、CPU の挙動を知らないままに、高級言語としての C を最初に触った人が陥る落とし穴です。逆にそれらの知識がある人にとっては、ポインタは何も難しいことがないのです。

投稿2019/05/17 05:02

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なぜ「ポインタ」という概念が生まれたのですか?

ポインタというのはレジスタ間接アドレッシングですから、レジスタ間接アドレッシングが生まれたのはなぜかとなると、こちらが分かりやすいです。
メモリアドレス
一言で言うと、「アドレスに対して計算できると便利」だからです。
例えば配列やスタックといった構造はアドレスに対して計算することで存在するものです。

アセンブラ言語の欠点を解消する為にそういう概念が生まれたのでしょうか?

いいえ、アセンブリ言語、というか機械語、CPUのアーキテクチャの段階で既に存在した概念です。

ポインターという概念がないとどうなるのでしょうか?

レジスタ間接アドレッシングを無くすと、
配列や構造体は使えなくなり、ローカル変数とグローバル変数の区別が無くなるので関数への再入もままならなくなり、まともなプログラムを書くことがほぼ不可能になります。
(それとも「ポインタ」という名前で使われるレジスタ間接アドレッシングのみを禁止するのでしょうか。名前で分けるのはあまり意味のある議論とは思えません。)

投稿2019/05/17 13:01

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「ポインタ」は難しくて、挫折者も多く

それは現在の教育側に問題が有るように思います。
CPU(アセンブラ?)の機能について何も語らずに、アドレスという観念すら教えずに、プログラム言語を教えるからではないでしょうか?
そのままコーディングすればちゃんと動くプログラムを作らせて、デバッグもちゃんと教えない。
で、アセンブラで言う所の68Kなら、move.w (A0),d0・・・みたいな・・・間接参照があってそれを言語に取り入れたのがポインタです。

投稿2019/05/17 04:14

編集2019/05/17 07:27
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/05/17 12:13 編集

ちなみに、Cよりも古いPL/1やPascalでもポインタはありますよ。 せめてZ80でいいので、User's Manualを読んでほしいですね。
guest

0

主記憶装置(メモリー)を使う上で有効だからです。

高級言語における変数代入や参照は、主記憶装置の利用手続きを表現したものです。いうまでもなく、主記憶装置のアクセスは整数値で番地を指定し、そこにバイト値を書いたり読んだりします。

C言語でのポインタは、主記憶装置の番地情報用に使われる変数の型です。

投稿2019/05/17 17:50

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

うん、順番が逆ですね
メモリというデバイスを使う以上、その内容を参照するのには、そのアドレスが必須です

理解できないものを、無理して学ぶ必要はないと思いますが。

# C#でいいぢゃん

投稿2019/05/17 04:18

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/05/17 05:34

Java でオブジェクト指向が理解できなくて C に入った人みたいなので、どこかで多少無理して学ぶ必要はあると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問