都道府県穴埋めゲーム

下名は、プログラムの完全な素人ではないのですが、

C言語の初心者が、ポインタがわかりにくいということがよくあると思います。
例えば、pythonや他の言語では、ポインタはなかったと思います。

C言語において、ポインタは、必須だったのでしょうか?
それとも、単に、配列ぐらいあれば、言語として、問題なかったのでしょうか?
C言語が、ポインタの機能で何を実現できているのか、理解を深めたく。

A 回答 (6件)

> C言語が、ポインタの機能で何を実現できているのか



データをコピーする手間を無くすことができます。
例えば要素の合計を求める関数を作って、その引数として要素100個の配列を渡すとしましょう。
関数の実行時には一時的にメモリ上に必要な作業エリアを確保します。
ポインタが無い場合は、作業エリアに要素100個を全てコピーしてきて、それを元に計算を始めます。
でもポインタがある場合は、元々の配列のアドレスだけをコピーしてきて、そのアドレスを進めながらアドレス先のデータを取得するという動作で計算を進めることができます。
データが1000個、10000個だったら、コピーする手間が更に余計にかかりますよね?


> C言語において、ポインタは、必須だったのでしょうか?

C言語はアセンブリ言語の面倒くささを改善するために作成されました。
アセンブリ言語でのプログラムを経験されればお分かりになると思いますがアクセスするメモリのアドレスを決定するのに「間接アドレッシング」が多用されます、これがポインタそのものなんですよね。
従ってアセンブリ言語の延長として開発されたC言語にはポインタ機能は当然存在すべきものだったと思います。


> 例えば、pythonや他の言語では、ポインタはなかったと思います。

他の方も仰っていますが見えなくなっているだけでポインタは存在します。
例えばPythonでインスタンスを宣言した場合の

 p = MyClass()

このpはポインタそのものです。
ただ、ポインタであることを意識しなくても良いように考えられているだけなんですよね。


> C言語の初心者が、ポインタがわかりにくいということがよくあると思います。

これはC言語でのポインタの記述の仕方が分かりにくいというのも多分にあると思います。
当初は「分かっている人」だけが使う為に設計された言語ですから、あまり考慮されなかったのですね。
ですから後に続く言語は、ポインタを意識しなくても良い様になったのではないでしょうか?
    • good
    • 1
この回答へのお礼

コメントありがとうございます。

下名自身は、慣れで、ポインタがわかりにくいと感じることはないですが、
以前は、なんとなく、わかりにくい気がした記憶はあります。

例えば、
char aaa[10];
とかで、aaaがポインタと言われても、、、、という感じがあるんですかね。
あと、変数を格納するメモリの意識があまりないのかも?、という気もしました。

お礼日時:2019/01/14 22:54

現在の Fortran にはポインタが存在しますが, 最初の FORTRAN にポインタというものは存在しません. こういう事例もあったりします.



あと「表向き『ポインタ』が存在しないように見える」のは
ポインタがあまりにも強力かつ自由なので勝手なことをすると危険
という知見も含まれているかもしれません>#5. その代わりに「自動的にアドレスからオブジェクトに変換する」ものを導入して「勝手気まま」にできないようにして, 心機一転「参照」という呼称を導入した... と妄想してみたりする. いろいろいわれる goto でも, いくつかの形でその機能は残ってますし.
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

お礼日時:2019/01/14 22:50

>例えば、pythonや他の言語では、ポインタはなかったと思います。


んなぁ事ぁないです。
PASCAL、アセンブリ言語では当たり前にあります。

>C言語において、ポインタは、必須だったのでしょうか?
逆に問いたいですね。近頃の言語がポインタを排除して何のメリットがあったのでしょう。
どうせ初心者が使わないのなら残して問題無かったはずですが…
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

お礼日時:2019/01/14 22:50

実は, 多くの言語で「ポインタ」は存在する. ただ, 特に「現代的」な言語では「ポインタ」として意識しなくていいようにいろいろなことをやっているので「ポインタはなかった」ように思えるだけに過ぎない. 例えば Java のような「オブジェクト指向」言語では「オブジェクトのアイデンティティ」はアドレスにあるので, それを表すために「ポインタ」を使わないわけにはいかない (「ポインタ」と呼んではいないけど). #1 でいわれている「ポインターの概念を理解していないと、とても判りにくい言語だと思います」はまさにそのことだね.



あと C はアセンブリ言語の代替でもあるので, その意味でもポインタがないと困る.
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

お礼日時:2019/01/14 22:49

ポインタを使う事で、プログラムの情報処理量を減らせます。

    • good
    • 1
この回答へのお礼

コメントありがとうございます。

お礼日時:2019/01/14 22:49

>>C言語において、ポインタは、必須だったのでしょうか?



C言語は、高級アセンブラともいわれています。
つまりは、機械語に近い言語なんですね。
Javaはポインターが無いとかいわれたりしますが、ポインターの概念を理解していないと、とても判りにくい言語だと思います。
まあ、ポインター無しにしたとき、処理のオーバヘッドが増えます。
それを許すプログラムもあるでしょうが、そうじゃあないプログラムもありますからね。

なおC言語には配列があります。
配列だけで済むプログラムであればいいのですけど、経験からすれば、複雑な機能を実現するには、ポインターは必須の機能ですね。
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

お礼日時:2019/01/14 22:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報