• ベストアンサー

メモリの中身は大切?

初歩の質問で申し訳ないです。 プログラミングするときには、 「メモリ内部に変数等がどのように格納されているかイメージできることが大切。(たとえばC言語において配列と、ポインタ配列のメモリの割り当て方が違うなど)」 とかいうのをたまに聞きますが、これってなんで大切なんですかね???

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

  • ベストアンサー
回答No.1

変数のメモリ上の配置に重要な意味があるか否かは言語によります。C/C++では大切(知らないとコードが書けないこともある)ですが、Javaなどではそれほどでもありません。

その他の回答 (1)

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 プログラミングするときに、一番、たくさんの行を費やすのは、変数の操作と変数の内容のチェックです。  というか、プログラミングって言うのは、ようするに、変数をいかに操作するかを定義する作業・・・と言い換えても、あながちはずれではありません。  というわけで、各変数に、今、何が入っていて、それをどうしようとしているのかが判らなければ、そもそもプログラミング作業できません。  ところで、変数の操作というのは、ようするに、メモリー内部の数値の操作です。つまり、メモリー内部の様子が頭に浮かばないと言うことは、何を、どのように操作しようとしているかが全く頭に浮かんでいないと言うことで・・・こんな状態では、まぁ、まともにプログラミングできるとは思えません。  というわけで、大概のプログラミングの書籍で、文法の学習にはいると、変数の定義、変数の内容の表現から話が始まるのが普通です。  つまり、基礎の基礎なわけですね。大切どころの話ではないのでした。  たとえば、C言語の学習をしてるときにの最大の難関といわれるポインターの取り扱いにおいて、何が判ってないかというと、具体的なメモリー内部のイメージです。これが判らないから、ポインターが理解できない。(もう少し、先になると、関数のポインターと言うのが登場します。メモリーイメージがきっちり頭に浮かばないと、概念すら理解できない分野です。これが理解できないのは、まず、プログラムの本体も、メモリーに展開された単なるデータと同じだということが判っていないことが多いです。)  大概の言語に備わっている配列が理解できないのも、根は同じです。  判らない人を見ていると、メモリーに対してどういう操作をしようとしているかが浮かんでないことが多いです。だから、添え字の操作を見ると訳がわからなくなる。  最初のうちは、紙に、メモリーイメージを書いて、具体的な数字をそこに入れて、計算する・・・・そういう学習は、プログラムを理解するのに有効なことも多いです。(私も、ちょっと複雑な操作になると、重要な部分のメモリーイメージを模式的に紙に起こします。微妙な操作を検証するのには一番手っ取り早いことが多いです。)

関連するQ&A

  • C言語のメモリ領域確保

    ポインタ変数ををmain関数で宣言し、関数test()にて必要分だけ領域確保してそのアドレスをmain関数のポインタ変数に渡して利用することは可能でしょうか。 (サイズのわからないテキストデータを、十分に大きな配列に入れるのではなく、関数でメモリを動的確保して無駄の無い配列に入れたい等) C言語ではやはり無理で、構造体のリストにするのが一番でしょうか。 初歩的なことで申し訳ありませんがどなたかお願いいたします。

  • C言語のポインタについて

    C言語のポインタ(配列もポインタに含まれるのか?)について質問です。 係数を行列形式で表される状態方程式などの2変数以上の方程式を解くプログラムにおいてよくポインタや配列が使われているのですが、なぜポインタや配列を使うのでしょうか?利点など詳しく教えていただけませんでしょうか。。。 どなたか分かる方よろしくお願いします(*_*)

  • メモリの初期値

    C言語の勉強をしている者です。 やっとこさポインタのところまでやってきまして、いろいろ試しているところなのですが、不可解な事が起こったので質問させてください。 int型の配列を作って、初期化しないままその配列[0]に入っている値を覗くと -858993460 という値が入っていました。 もう一度配列を作り、メモリのアドレスを確認すると、前に作った配列とポインタのアドレスが同じだったので そこに0を入れました。 当たり前ですが配列[0]の値は0でした。 さらにもう一度配列を作り、[0]のアドレスの中身を覗くと -858993460 という値に戻っていました ※配列[0]のアドレスは常に一緒です。 なぜこんな訳のわからない数字( -858993460 )に初期化されているんでしょうか 一度0に初期化したのなら次は0のままになっていると予測していたのですが、どうなっているんでしょうか どなたか理由のわかる方いませんか

  • C++とC#って何が違うのですか?

    C++とC#って根本的に何が違うのでしょうか? 私はC言語でちょっとしたプログラミングをするか、C#で電卓くらいしか作れないのですが、「C++はメモリ管理が大変」とか聞きますが、どのように大変なのですか?配列の宣言と削除くらいしか知らない超ど素人です。。 そもそもメモリを気にするほどのアプリケーションを作れないのでイマイチC++の大変さんがわかりません。 あとC#にポインタがないと聞きますが、ないとどういう問題が起こるのでしょうか?

  • ファイル名に日付・時刻を付与したい

    Cプログラミングの経験はあるのですがperlのソースを初めて 改造することになりました。 変数「$i」にはシェルのファイル名が入ります。 #FS000.csh このファイル名に日付・時刻を付与して、 FS000mm(月)dd(日)hh(時)mm(分)ss(秒).csh というファイル名にしたいのですが、どうしたらいいのでしょうか?? C言語だったら、配列を宣言して、その配列にファイル名を格納、という 書き方をしようかと思うのですが、 perlでの書き方がさっぱりわかりません・・・。 変数(C言語では配列)を定義したりしなくてもいいのでしょうか? わかりにくい質問ですみませんがどうか宜しくお願いします!

    • ベストアンサー
    • Perl
  • C言語 エラトステネスのふるい ポインタ

    C言語のプログラミングなのですがどなたか教えて頂けませんか。(説明も) エラトステネスのふるいを用いて,10000 までの自然数に素数がいくつあるかを表示するプログラムを作れ。 ただし , 配列は用いず, ポインタを用いること メモリの確保には malloを使うこと よろしくお願いいたします。

  • 「配列名はポインタ」という表現は間違っているのでは?

    よくネット上で、「配列名はポインタ」というような表現が出てきますが、 「配列名はポインタになっているのである。 http://www.wakhok.ac.jp/~kanayama/C/99/node111.html」 このような表現は、間違っているのではないでしょうか? C言語を作った本人によるK&Rのp.121には、次のように書かれています。 配列名とポインタの間には、心に留めておかなければならない違いが一つある。 ポインタは変数であり、したがってpa=aやpa++は意味のある演算である。   ←(1) しかし配列名は変数ではない。したがって、a=paやa++のような構文は正しくない。 ←(2) (1)より、 ポインタは、変数である ので、この対偶をとると、 変数でないものは、ポインタではない  ←(3) となります。 (2)より、 配列名は、変数ではない  ←(4) となるので、 (3)と(4)から、 配列名は、ポインタではない ←(5) となります。 そうすると、「配列名はポインタ」というような表現は間違っていることになり、誤解の元になるので、改めるべきではないかと思うのですが。

  • メモリを0クリアする方法について

    組み込み系のc言語でメモリを0クリアするには、どのようなプログラムにすればいいでしょうか?アドレス値を格納するポインタの型は、unsigned long型です。 仮に範囲は、0x1f00~0x2000とします。

  • メモリの中身(サイズ)を知る

    C#でOutOfMemoryExceptionが発生しているのですが、 メモリの中身(サイズ)を知ることは可能でしょうか? 具体的にいうと、どの変数がどのくらいメモリを消費しているのかなど。

  • C言語のプログラミング作成なのですが....

    C言語の問題なのですが、大きさ100の配列に1から10の一様乱数を格納しヒストグラムを*を使ってプログラミングするというものなのですがさっぱりわかりません。わかる方どうかよろしくお願いします。

専門家に質問してみよう