- 締切済み
C言語のポインタのどのあたりが難しいと思いますか?
C言語のポインタは初心者にとって大きな壁であるとよく言われます。 具体的にポインタのどのあたりが難しいと思いますか? 経験者の方、初心者の方などいろんな意見をお聞かせください。 ちなみに私もポインタでつまづいた人間の一人です。 つまづいた箇所は一箇所ではないのですが、例を挙げるなら int *p; p = &a; *p = a; で pと *pの違いがわからなかったですね…。\0とNULLの違いもごっちゃになっていましたし。 似たような表記だけど意味は違う、という箇所にひっかかっていました。 ポインタがどのようなものなのかというイメージは理解しやすかったのですが…。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 本人は躓いたことはまったくないのですが、躓いてる人は多々拝見しています。 躓く方の多くは、ある程度「上澄みだけ」を学ばれている方に多いように思います。 直接的に書くと「頭の中でメモリイメージが持てるか否か」がおおよそ分かれ目であるようです。 イメージが出来ればポインタもわかるし、逆もまたしかり。 書式は私もしょっちゅう忘れますが(笑)、書式だけなら、それこそ小さなメモが一つあれば思い出せるので。 ただ、概念を理解するしないは、致命的な差異になってしまいます。 個人的には。やはり「一度はマシン語やっとけ」って思ってしまいます。 まぁ…あんまりマシン語とかやり過ぎると、オブジェクト指向で引っかかる人も少なくないのですが(苦笑 慣れればどっちも簡単なんですがねぇ。 以上、年齢いったおっちゃんの戯言です。
- koko_u_
- ベストアンサー率18% (459/2509)
関数ポインタの宣言などほとんど暗号ですな。 ポインタの概念が原始的なため、ソースコードと、それが実現しようとしている意図との間に距離があることが難易度を高めていると思います。 # ぱっと見て、何をしようとしているのかが分からない 他にポインタ絡みで言えば、動的に確保した領域を開放し忘れたり、逆に開放済みの領域を再度開放してしまったり、非常にナイーブな所までプログラマが面倒を見なければならない所かな。 というわけで、もっぱら C++ で書いてます。 # 関数ポインタは関数オブジェクトで、 # 動的な領域を確保したら取りあえず auto_ptr につっこんでます。
お礼
ご回答ありがとうございます。 >ぱっと見て、何をしようとしているのかが分からない 私も似たようなことを感じました。 何かを指しているんだろうなあとまではイメージできたのですが、だから何?何でそんなことをするの? と思っていました。
- 5S6
- ベストアンサー率29% (675/2291)
別に難しいとは思いません。 ポインタはアドレスを指すのであって本体ではない。 ポインタでないものは&をつけることによりアドレスを指す。 と言うだけです。 \0は文字列終わりを差しNULLは何もない。 と覚えれば簡単です。 ポインタのポインタとかもあるけど既にポインタを使った プログラムなんて学生の勉強用ぐらいにしか使いません。 ただし非常に速度重視プログラム、ハッカーなどになりたい場合は 必要ですね。 スタックオーバーフローってどんなの?とか。
お礼
ご回答ありがとうございます。 >ポインタはアドレスを指すのであって本体ではない。 >ポインタでないものは&をつけることによりアドレスを指す。 シンプルにまとめるならそうなると思いますし、ある程度ポインタを理解した今ならその言葉の意味がわかるような気がします。 ただ、ポインタに触り始めたころは 「ポインタはアドレスを指すのであって本体ではない。」ってどういうこと?本体って?指すって?? 「\0は文字列終わりを差しNULLは何もない。」って?何もない??\0はヌル文字じゃないの?ヌルなのに違うの?? のように、 メモリ上のポインタの動きや単語の意味が全然イメージできていなかったです。 お恥ずかしい限りです。 ポインタという概念自体が全くの未知のものだったので混乱していたんでしょうね。
大分前にCでプログラム書いてましたが、本当に苦手で、ポインタも あいまいに覚えていたので、ダンプで中身を確認して結果的に動けばOKみたいな感じでした。 文字列のコピーとか配列のコピーとか、文字列操作でインクリメントした時の中身とか、最終的に理解できてなかったと思います。 Javaに慣れてしまった今は細かいことなど、あとかたもなく忘れました。
お礼
ご回答ありがとうございます。 >あいまいに覚えていたので、ダンプで中身を確認して結果的に動けばOKみたいな感じでした。 ポインタに限った話ではありませんが、私もどうしてそうなるのかよくわからないけど動いたからいいや!という時があります。 本当はきちんと理解しておいた方がいいってわかっているんですけどね… 配列に限らず、ポインタは構造体など他のものにからむとややこしくなるように思います。
- fallen_angel
- ベストアンサー率12% (287/2339)
僕もC言語は挫折した派です。 FORTLANやBASICからですと分かりにくいですね。 アセンブラを学ぶと分かりやすいのですが、C言語では、ポインタのポインタが使えるので、ここで撃沈しましたねぇ。 FORTLANやBASICで配列に、どっぶり漬かってしまったので(FORTLANなら5次元以上でもOKでしたが、、)、文字列をポインタで扱うのが習得できませんでした。それから文字列の終了の記述ですね。
お礼
ご回答ありがとうございます。 文字列をポインタで扱う…ということは配列のポインタですよね。 私は先頭アドレスを理解するのに時間がかかりました。 というか、C以外の言語は勉強したことがないのでFORTLANやBASICの方がわからなかったりします(汗)
お礼
>「頭の中でメモリイメージが持てるか否か」 まさにこれだと思います。 アドレスとポインタ、ポインタの型、ポインタの意味etcのイメージを整理するのに図に書こうとしたのですが、 最初はまったく書けませんでした。 ポインタが何を指すのか、指すとはどういうことなのか。 具体的な形にまとまるには時間がかかりました… >慣れればどっちも簡単なんですがねぇ。 きっちり概念を理解できるかが鍵ですね。