• ベストアンサー

C言語のポインタを理解するには

今、自分はC言語のポインタを勉強しているのですがメモリの動きなどが想像できません・・・(なんでポインタを使うと速くなるのかなど) 聞いたり調べたところアセンブラをやると理解できるとのことでアセンブラをやろうと思ってるのですが他になにかやるべきことはあるでしょうか? 後コマンドプロンプトとPICは勉強になるでしょうか? 昔のパソコンを使ってるとパソコンがよくわかるみたいなことを聞いたのですが昔のパソコンなんて持ってないのでCUIのコマンドプロンプトを勉強すればなんかわかるかなと思って。 PICは自分で作れば勉強にもなるしそこからなんか得られるかなと思って聞いてみました。 まだパソコンをもって長くないのでいろいろと調べたのですがどうしてもよく理解できないところがあり質問におかしいところがあるかもしれないですがお返事よろしくお願いします。

noname#61385
noname#61385

質問者が選んだベストアンサー

  • ベストアンサー
  • f_attck
  • ベストアンサー率33% (40/118)
回答No.3

組み込みのお仕事しています。 お気持ちは良くわかります。 やる気もあり、将来も有望ですね。 ただ、やる気のある若い人におおいのですが、あれもこれもと 気ばかりがあせってしまってるような気がします。 確かに、勉強し始めですので、やらなければならないこと 知りたいことはたくさんあると思いますが、一つ一つ段階を ふまえてやるほうが、しっかりとしたスキルが身につくと思います。 まずは、アセンブラかCかどっちかに絞ってやってみては どうでしょう? C言語を選択されるのであれば、いきなりマイコンではなく linuxとか使ってアプリみたいなもんを作って、言語についての 知識を身に付けていくと良いと思います。 cuiに関してもwindowsを使うよりはlinuxを使って、窓操作を する方が、身につくと思います。 #その方が、バグもなく正確ですしね。 後は、自分で調べておられるようですが、それが非常に大事な 事なんです。 人に教えてもらったことなんて、すぐ忘れちゃいます。 けど、苦労して苦労して得た知識は、その苦労した思い出と共に 頭に残ります。 まずは、言語に対するスキルをあげてから、マイコンでの勉強を 始められることをお勧めします。 あとは、自分がどういうレイヤの技術が欲しいのかを明確にして 勉強を始めると良いかと思います。 アプリやミドルならC言語。ドライバやチップ周りならCもアセンブラ もあるので、その中でも上位層ならC、下位層ならアセンブラという 感じで、勉強する言語を選択しては如何でしょか お勧めは、C言語からですかね。 言われているポインタを習得してからの方が、アセンブラに入り安い と思います。 ポインタに関してだけではないですが、難しかったり、理解しにく かったりした場合は、絵を描きましょう。 #職場の新人にもやらせてます。

noname#61385
質問者

お礼

お返事ありがとうございます。 レイヤというのはよくわからないですが自分がしたいのはwebプログラミングです笑 PHPとかperlやるべきなのかもですが中途半端にC言語おわらすのもいやだしCの方が処理が速いらしいのでCをやってます。 絵描いてやってみようと思います。

その他の回答 (6)

  • ency
  • ベストアンサー率39% (93/238)
回答No.7

いろいろな意見が出ているようですが、私はポインタはアドレスとは切り離して考えるべきだと思っています。 まぁ、「ポインタ=アドレス」というのもある意味正解で、ある意味間違っていますからねぇ。。。 単純に「ポインタ」を勉強したいだけなら、アセンブラを勉強する必要もないと思います。 っていうか、アセンブラ知らずに 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% (2126/6288)
回答No.6

「図解C言語 ポインタの極意」という本を読んでみてはいかがでしょうか。

参考URL:
http://www.bohyoh.com/Books/ZKCpointer01/index.html
回答No.5

「Cにおけるポインタ」を知りたいのであれば,メモリの動きもアセンブラも関係ありません。 単純に, ・他のオブジェクト (変数が代表) や関数の別名を作り出す機能 (間接参照) ・配列要素へのアクセス機能 (配列反復子) がポインタの機能です。 メモリとかアセンブラとかを知れば,特定の実装におけるポインタの振る舞いがよくわかるのですが,それを「ポインタとはこういうものである」と勘違いしてしまう可能性が高いです。 8086の主だったコンパイラにおいて,ポインタの実装がCコードに影響を与えていたことが,ポインタとメモリやアドレス,アセンブラを結びつける原因になっているのかもしれません。

  • yphkz4063
  • ベストアンサー率23% (34/144)
回答No.4

ポインタを知るには、アセンブリ言語を勉強するのも、CUIでやるのも、質問者様のおっしゃるとおり、有効なことです。 その他では、デバッガを使いこなすことが、いい勉強になると思います。 C言語もインラインアセンブラで記述することもできます。 コンパイラが吐き出したもの、あるいは自分で書いたコードを、マシン語レベルでトレースしながら、レジスタやフラグの変化を見てみるのもいいでしょう。

noname#61385
質問者

お礼

お返事ありがとうございます。 デバッガって不具合の発見だけでなくレジスタなどの状態もみれるんですね!はじめて知りました笑 borlandでできるならやってみようと思います!

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

PICで学ぶというのは正解です。 ただ、PICのアーキテクチャはちょっと特殊なので、可能であればH8のような普通のマイコンのほうがよいかもしれません。

noname#61385
質問者

お礼

お返事ありがとうございます。 そうなんですか。 それなら確かにH8のほうがいいかもしれないんで調べてみます!

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.1

アセンブラはいきなりx86のをやると複雑で分からなくなりますので、情報処理試験向けのCASL2等が簡素で分かり易いでしょう。 昔のパソコンを持っているとではなく、昔パソコンを使っていると今ほどソフトが複雑ではないので自分で色々いじれたと言うことです。 そして、いじる過程でプログラムを作ったりもしたと言うことです。

noname#61385
質問者

お礼

お返事ありがとうございます。 x86ってやっぱり初心者には複雑ですか・・・ CASL2についても調べてみようと思います。

関連するQ&A

  • PICライタ (C言語→HEXファイル)

    今PICライタについて独学で勉強しています。 今ソフト的には秋月のPICライタおよび、MPLAB使ってます。 しかし、MPLABがC言語読み込めないため迷っています。 そこで質問なんですが (1) C言語をアセンブラ言語に変換する無料ソフトありますか? (2) (1)をあきらめたとしてアセンブラ言語で書くとして、アセンブラ言語でPICのプログラム書くための、わかりやすい本などご存知ですか? やっぱりCコンパイラを買うしかないのでしょうか??

  • MPLAB C18のC言語について

    趣味でPICをはじめて、いままではアセンブラ言語でプログラムを書いてきました。 こんどPIC18Fに挑戦しようと思っているんですが、PIC18FはC言語で書いた ほうがいいらしいですね。無料でMPLAB C18というC言語のコンパイラが使えるらしいですし。 C言語は勉強したことがないので、とりあえずC言語を勉強しなければならないんですが、 C言語っていろいろ種類があるんですね。C,C++,C#、あとvisual basic系のCとか。 なんだかさっぱりわかりません。 MPLAB C18のC言語にもっとも近いのはどれでしょうか。おしえてください。

  • アセンブラ→C言語

    アセンブラを学んでから C言語を学ぶとわかりやすい(理解しやすい) と聴きました。 どうやって勉強すれば良いですか? やっぱり本屋さんでアセンブラについての本を買って 勉強した方が良いですか? 今まで全くコンピュ-タ-についての言語を 習ったことがありません。

  • C、C++、Peal、PHPその他「高級言語」といわれる言語について

    僕はPICマイコン(16シリーズ)を趣味で使っており 言語はアセンブラを使っています。 で、質問なんですが最近ホームページを作りたくなり LINUXの勉強も含め自宅サーバーを立ち上げCGIをやってみようと思いました。 で、CGIといえばPealだろと思っていたので、その手の入門書や ネットの情報を見ると冒頭には大抵「大して難しくない」的な事が 書いてありました。 実際にやってみたんですがチンプンカンプンでした。 イメージとしては下記のような感じなんだと思うんですが マイコンのアセンブラと比べたらよっぽど低級言語な気がしてなりません。 アセンブラ=低級言語=人間にわかり難い C、C++等=高級言語=人間に解り易い アセンブラもはじめはチンプンカンプンでしたが、ある程度理解してしまえばそれなりに使いこなせるようになりました。 マイコンのアセンブラは命令数も少ないしイエスかノーだけで「もしも~」とかないので単純といえば単純なんですが・・・ 質問1 高級言語の「人間に判りやすい」っていうのは具体的にどういうことなんでしょうか? 質問2 最近やたらとPHPが流行ってる気がします。 もうPealは廃れてしまったんでしょうか?

    • ベストアンサー
    • Perl
  • C言語の悲しさ

    C言語を勉強しようとC言語の教材をこの間買ってきたのですが、 自分の予想していた?プログラムは、 灰色のウィンドウがでてきて、ボタンがあって、選べたりラジオボタンがあったりの、ソフトウェアみたいなのだったのですが、 実際、コマンドプロンプトという、すごく地味なものだったので、がっかりしました。 自分の予想のようなソフトウェアを作るのには、どういう言語が必要なんでしょうか? それとも、C言語にも、そのようなソフトウェアが作れるのでしょうか?

  • C言語でDOS画面のプログラム(できるなら、メニュー方式で関数ポインタとか使ったものがいいです)

    いまどきあるかわかりませんが。。 C言語をだいぶ勉強したので本格的にプログラムを作ってみたいです(趣味プログラマーです)。 そこで、DOS画面(というかコマンドプロンプト)で、メニューを選択して色々な処理を行うプログラムを作ってみたいです。私は、関数ポインタが気に入りましたので、関数ポインタがあると尚いいです。 いまどき、こんなプログラムがあるか知りませんが、ご存知の方はおしえてください。よろしくお願いします。WINAPIとかは、なしの方針で・・

  • C言語の勉強について

    C言語の勉強について わたしは、前からC言語に興味を持っており入門書を買って勉強しました。 基本的なことは理解できましたが、これからどうすればいいのかわからなくなってしまいました Cに興味を持つ前はHSPをしていたのですが、これはさすがにプログラムの基本さえわかっていれば ヘルプを開き自分で考えて、だいぶ本格的ななゲームも作れたのですが、Cは思ったとおりに行かなくて そもそも、コマンドプロンプトから実行するプログラムしかわからないのですが みなさんは、私くらいのころはどんなことをしていましたか? ひたすらプログラムを書いていましたか? それとwindowsアプリケーションの開発はもっと後になりますか? C言語ではどんなソフトを作ったりしたことがありますか?

  • C言語もしくはC++言語プログラマになれますか?

    私は30歳になったばかりです。諸事情によりずっと家にいます(母親の病気などです)。 5年ほど前JavaでWebシステムを作っていましたが、やめました。それ以降もJavaやPHP、VB.NETなどやってはいるんですが、なかなか腰を落ち着けられません。 私は本来の性格として基礎固めが大好きというか基礎がしっかりしていないと意味がないと考えてしまうタイプです。こと、プログラムに関しても、コンピュータの仕組みから理解してアセンブラやらの書物を読み、C言語を勉強したりするとコンピュータを根本から理解できて、やっと自分の役に立つという思考しかできないものです。いきなり高級言語のJavaやらC#やら.NETやらやっても、うわべだけさすってるようで、根本的な理解を得られないので(コンピュータに対する)、無駄だなあとどうしても感じてしまうのです。また、それよりも基礎からしっかり積み重ねた方が後々、新しい言語ができても理解の度合いというかどっしりと理解できるとおもうのです。 しかし、就職のことを考え、PHPやらC#やらJavaやらVB.NETやらを優先してきてどれもどっちつかずになってしまいました。当然Cなども合間をぬってやっていました。 で、私は、そのどっちつかずな状態がいやなので、CとC++に絞って勉強することにしました。で、低級コンパイラの中身やアセンブラも勉強していこうと決心しました。しかし、就職のことを考えると不安です。 あと、1年みっちり勉強するとして、CやC++の就職先はあるのでしょうか?自分としては、働ける限り年齢がいくつになってもがんばりたいとおもうのですが、なにしろ世間的にいうと全く遅い年齢です。もし、励ましになるような事もありましたら、ご回答していただければ、うれしいです。よろしくお願いします。

  • C言語次のステップ

    C言語について一通り勉強しました。 (入門的な本に書いてあるような事柄) 次に勉強するといいことを教えてください。 それから、入門レベルよりひとつ上の内容の書籍があれば教えてください。 ポインタ、アセンブラ、 マルチスレッド、マルチプロセス、といった ちょっと深いテーマみたいなのも教えてください。 (ここにあげたのもいまいちわかってませんが、、)

  • C言語とアセンブラ言語による計算プログラミング

    "AB間の距離を求めなさい。" 下の画像において、AC=r1、BC=r2、∠ACB=α°とするとき、AB間の距離dを求めなさい。 上記の問題について困っております。 この問題の解答については、C言語とアセンブラ言語によるプログラミングで考えるようになっており、FPU(MATH COPROCESSOR)を使用し、C言語側で変数や関数宣言、printfなどでの計算結果出力を記述し、アセンブラ言語側で計算するプログラム問題です。 原則として、C言語側で計算してはいけない仕様になっています。 そして、2つのオブジェクトファイルをリンクさせ、実行可能ファイル(.exe)を作成し、コマンドプロンプト に計算結果を表示する。とういう問題です。 ・アセンブラ言語側での使用する命令のプロセッサアーキテクチャのタイプは「.386」 ・作成するオブジェクトのメモリモデルは、Windowsなので「FLAT」 図の画像は添付してあるので、どうかご回答のほどよろしくお願い致します。

専門家に質問してみよう