- ベストアンサー
C言語のポインタを理解するには
今、自分はC言語のポインタを勉強しているのですがメモリの動きなどが想像できません・・・(なんでポインタを使うと速くなるのかなど) 聞いたり調べたところアセンブラをやると理解できるとのことでアセンブラをやろうと思ってるのですが他になにかやるべきことはあるでしょうか? 後コマンドプロンプトとPICは勉強になるでしょうか? 昔のパソコンを使ってるとパソコンがよくわかるみたいなことを聞いたのですが昔のパソコンなんて持ってないのでCUIのコマンドプロンプトを勉強すればなんかわかるかなと思って。 PICは自分で作れば勉強にもなるしそこからなんか得られるかなと思って聞いてみました。 まだパソコンをもって長くないのでいろいろと調べたのですがどうしてもよく理解できないところがあり質問におかしいところがあるかもしれないですがお返事よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
組み込みのお仕事しています。 お気持ちは良くわかります。 やる気もあり、将来も有望ですね。 ただ、やる気のある若い人におおいのですが、あれもこれもと 気ばかりがあせってしまってるような気がします。 確かに、勉強し始めですので、やらなければならないこと 知りたいことはたくさんあると思いますが、一つ一つ段階を ふまえてやるほうが、しっかりとしたスキルが身につくと思います。 まずは、アセンブラかCかどっちかに絞ってやってみては どうでしょう? C言語を選択されるのであれば、いきなりマイコンではなく linuxとか使ってアプリみたいなもんを作って、言語についての 知識を身に付けていくと良いと思います。 cuiに関してもwindowsを使うよりはlinuxを使って、窓操作を する方が、身につくと思います。 #その方が、バグもなく正確ですしね。 後は、自分で調べておられるようですが、それが非常に大事な 事なんです。 人に教えてもらったことなんて、すぐ忘れちゃいます。 けど、苦労して苦労して得た知識は、その苦労した思い出と共に 頭に残ります。 まずは、言語に対するスキルをあげてから、マイコンでの勉強を 始められることをお勧めします。 あとは、自分がどういうレイヤの技術が欲しいのかを明確にして 勉強を始めると良いかと思います。 アプリやミドルならC言語。ドライバやチップ周りならCもアセンブラ もあるので、その中でも上位層ならC、下位層ならアセンブラという 感じで、勉強する言語を選択しては如何でしょか お勧めは、C言語からですかね。 言われているポインタを習得してからの方が、アセンブラに入り安い と思います。 ポインタに関してだけではないですが、難しかったり、理解しにく かったりした場合は、絵を描きましょう。 #職場の新人にもやらせてます。
その他の回答 (6)
- ency
- ベストアンサー率39% (93/238)
いろいろな意見が出ているようですが、私はポインタはアドレスとは切り離して考えるべきだと思っています。 まぁ、「ポインタ=アドレス」というのもある意味正解で、ある意味間違っていますからねぇ。。。 単純に「ポインタ」を勉強したいだけなら、アセンブラを勉強する必要もないと思います。 っていうか、アセンブラ知らずに C のポインタを使ってプログラムをガリガリ書いているプログラマなんてそこらじゅうにいるわけですからね。 それから、ポインタを使うと処理が早くなる、なっていうのもいまは昔の話でしょう。 ポインタ演算は、見にくくなるので必要最小限に…というのが、私の意見ですね。 ちなみに、ポインタは、まず「ポインタ型」があるということをしっかりと抑えることが大事です。 それがわかれば、あとは「ポインタ型の変数」「ポインタ型の値」というように、その先の理解もスムーズにいくのではないでしょうか。 あと、配列は式の中では、いくつか例外があるにしろポインタに成り下がります、なんていう C でしか通用しない特殊は話は、個別に覚えていけば良い話だとおもいます。 # ちなみに、ポインタ型の値としてアドレスが使われることが多いので、 # ポインタ=アドレスというある意味間違った理解が出回っているんじゃないかなぁ。 # そもそも、C の仕様に「ポインタはアドレスだ」なんてことはひとことも書かれて # いないんですからね。 # 単に、実装上の都合ってやつです。 # ご参考まで。。。 単純にポインタに絡むアドレスの動きを知りたいだけなら、変数やら配列やらのポインタを printf() なんかで片っ端から表示させてみるのも良いと思いますよ。 そのときに、グローバル変数 (外部変数) は何番地あたりのメモリ領域に確保されるのか、ローカル変数 (自動変数) は何番地あたりのメモリ領域に確保されるのか、関数の仮引数はどうか、などといったことに注意して見てみるほうがよっぽど有益だと思います。 たとえば、 int main( void ) { int hoge; int piyo[3]; printf( "&hoge=%p\n", &hoge ); printf( "&piyo[0]=%p, &piyo[1]=%p, &piyo[2]=%p\n", &piyo[0], &piyo[1], &piyo[2] ); return 0; } なんてことをやってみると、コンパイラがどんな順番に変数を配置していくのかがわかるし、もう少し詳しく見ていくと、セキュリティホールなんかで言われているバッファオーバフローはなぜ起こるのか、なんてことまでわかっちゃったりします。 なんとなく、ポインタを理解するだけのためにアセンブラを勉強するというのが、あまり有意義には思えなかったので、別の視点から書かせてもらいました。 ポインタ=アドレスという考えにとらわれると、良いプログラムがかけなくなる恐れがあります。 私の場合は、ふだんポインタ=アドレスと意識することはほとんどありませんね。 単に「この変数を指しているもの (指しているものだから「ポインタ」)」と考えることがほとんどでしょう。 むしろ、こっちの理解のほうが大事なんじゃないかなぁ。 ま、これは、あくまで私の個人的な見解です。 というわけで、参考意見とさせてもらいました。
- asuncion
- ベストアンサー率33% (2127/6289)
「図解C言語 ポインタの極意」という本を読んでみてはいかがでしょうか。
- Yune-Kichi
- ベストアンサー率74% (465/626)
「Cにおけるポインタ」を知りたいのであれば,メモリの動きもアセンブラも関係ありません。 単純に, ・他のオブジェクト (変数が代表) や関数の別名を作り出す機能 (間接参照) ・配列要素へのアクセス機能 (配列反復子) がポインタの機能です。 メモリとかアセンブラとかを知れば,特定の実装におけるポインタの振る舞いがよくわかるのですが,それを「ポインタとはこういうものである」と勘違いしてしまう可能性が高いです。 8086の主だったコンパイラにおいて,ポインタの実装がCコードに影響を与えていたことが,ポインタとメモリやアドレス,アセンブラを結びつける原因になっているのかもしれません。
- yphkz4063
- ベストアンサー率23% (34/144)
ポインタを知るには、アセンブリ言語を勉強するのも、CUIでやるのも、質問者様のおっしゃるとおり、有効なことです。 その他では、デバッガを使いこなすことが、いい勉強になると思います。 C言語もインラインアセンブラで記述することもできます。 コンパイラが吐き出したもの、あるいは自分で書いたコードを、マシン語レベルでトレースしながら、レジスタやフラグの変化を見てみるのもいいでしょう。
お礼
お返事ありがとうございます。 デバッガって不具合の発見だけでなくレジスタなどの状態もみれるんですね!はじめて知りました笑 borlandでできるならやってみようと思います!
- jacta
- ベストアンサー率26% (845/3158)
PICで学ぶというのは正解です。 ただ、PICのアーキテクチャはちょっと特殊なので、可能であればH8のような普通のマイコンのほうがよいかもしれません。
お礼
お返事ありがとうございます。 そうなんですか。 それなら確かにH8のほうがいいかもしれないんで調べてみます!
- wolf03
- ベストアンサー率22% (241/1086)
アセンブラはいきなりx86のをやると複雑で分からなくなりますので、情報処理試験向けのCASL2等が簡素で分かり易いでしょう。 昔のパソコンを持っているとではなく、昔パソコンを使っていると今ほどソフトが複雑ではないので自分で色々いじれたと言うことです。 そして、いじる過程でプログラムを作ったりもしたと言うことです。
お礼
お返事ありがとうございます。 x86ってやっぱり初心者には複雑ですか・・・ CASL2についても調べてみようと思います。
お礼
お返事ありがとうございます。 レイヤというのはよくわからないですが自分がしたいのはwebプログラミングです笑 PHPとかperlやるべきなのかもですが中途半端にC言語おわらすのもいやだしCの方が処理が速いらしいのでCをやってます。 絵描いてやってみようと思います。