- 締切済み
ポインタの使用方法について困っています。
ポインタの機能がありますが、 どの本を読んでも、配列かどこかのメモリのアドレスを示すか書いてなく、アドレスの表示を見て自己満足する為の物としか感じられません。 この機能がゲームを作る上で、何に使えるのでしょうか? 教えてください。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- kakusuke
- ベストアンサー率36% (95/259)
使用方法について困っているのではなく、 ゲームを作成するにはいらない(と思っている)のに なんで覚えなくちゃならないの? という質問ですかね? 低級~中級のプログラミング言語では、 参照と実体を持つということは理解されていると思います。 参照のための領域サイズと 実体のための領域サイズでは こと画像処理に関していえば 細かく表現しようとすればするほど 実体のための領域サイズのほうが大きくなります。 たとえば、メソッドを呼び出すときのように、 ヒープ領域を使用する場合、 実体をコピーする値渡しよりも 参照をコピーする参照渡しを行ったほうが、 処理速度が向上するということです。
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19862)
因みに。 最近のオブジェクト指向型高級言語(C++とかC#とか)だと、オブジェクトは実体を宣言するだけで動的に確保され「その正体はポインタである」と言う事実が隠蔽されています。 つまり「見た感じ、ポインタには見えない」のです。 なので、他の回答者さんのように「ポインタなんか滅多に使わない」って回答が出たりします。 ですが、そういう回答者さん達も「自分でポインタを扱っていると気がつかないうちに、ポインタを使っている」のです。 なにせ「ポインタ」と言う物は「正体のハッキリしない、怪しいヤツ」なので、オブジェクト指向型高級言語は「それがポインタだとは気付かないように、もっと解りやすい物のように見せかけ、プログラマを甘やかしている」のです。 ともかく、例えポインタのように見えなくてもその正体はポインタだったりする事が多い訳で「ポインタが無いと何も出来ない」のは変わりません。
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19862)
現在の「オブジェクト指向型プログラミング」においては「ポインタは欠かせない物」です。 なぜなら、オブジェクト指向型プログラミングでは「オブジェクト」は「動的に確保したメモリ上に配置されるのが普通」だからです。 で「メモリを動的に確保」するのですから「メモリ上のどこに確保されたかを示すアドレス」を保持する必要があります。 「アドレスを覚えておく」のですから、それは「ポインタ」に他なりません。 また、コンピュータ上のメモリは無限にある訳じゃありません。 なので「必要になった時だけ、必要なメモリを確保し、要らなくなったら開放する」と言う事をしないとなりません。 例えば、とあるシューティングゲームで「1ゲーム中、のべ3千万発の弾が発射される」と仮定します。 もし、この3千万発分の弾の座標を覚えておく為のメモリを最初から用意してしまうと、とんでもなく膨大なメモリが必要です。 もし仮に「のべ3千万発だけど、同時に画面に出るのは100発まで」だとしたら「必要な時に100発分のメモリを確保し、要らなくなったら開放」すれば、必要最低限のメモリさえあれば良くなります。 「メモリを確保し、確保したアドレスを覚えておき、そこを使う」には「ポインタ」が絶対に必要になります。なんせ「アドレス=ポインタ」なんですから。 ポインタがなければこんな事は絶対に出来ません。 >この機能がゲームを作る上で、何に使えるのでしょうか? 今の時代、ポインタ無しでアドレス固定で動いているプログラムは、メモリが1024バイトくらいしかない、家電品制御用の組込系マイコンのプログラムくらいしかありません。 断言しても良いです。もしポインタが無かったら、ゲームどころか、画面に「Hello world」って表示するだけのプログラムでさえ、書くのは不可能です。 現代においては「すべてのプログラムは、ポインタを中心に廻っている」のです。 >アドレスの表示を見て自己満足する為の物としか感じられません。 つまり「ポインタなんか存在してなくても良い」と? 「ポインタの存在の否定」は「アドレスの存在の否定」です。「ポインタ=アドレス」ですから。 「アドレスの存在の否定」は「メモリの存在の否定」です。アドレスが無ければメモリが有っても無意味です。 「メモリの存在の否定」は「状況変化の否定」です。メモリが無ければ状況の変化を記憶する事が出来ません。 「状況変化の否定」は「入力の否定」です。状況の変化を受け入れないなら、入力に変化が有っても無意味です。 「入力の否定」は「ゲームプログラムの否定」です。コントロールパッドやキーボードやマウスなどの入力を受け付けないなら、それはゲームとは言えません。 質問者さんの「ポインタなんか要らない」と言う考えは「ゲームプログラムそのものを否定するのと同等」です。 その考えは「入力も何も無し、画面の変化も何も無し」の「何もしないプログラムしか認めない」と言っているのと等しいです。 そして「何もしないプログラム」は、既にプログラムとは言えないですから、結局は「プログラムそのものを認めない」と言っているのと等しいです。 私の意見を言えば「ポインタなんか要らないって言うのは、電気なんか要らないって言ってるのと同じで、もし電気が無かったら何も出来ないのと同じで、もしポインタが無かったら何も出来ない」って感じ。 ポインタも電気も「使い方を知らなければ、何の役に立つかまったく判らないし、知らずに下手に触ると感電したりして酷い目に遭うけど、一度使い方を覚えた後は、絶対に無くなったら困る物」です。
- kkk1024
- ベストアンサー率33% (42/127)
こんばんは。30代偽SEです。 他の方が既に回答されてますが… 確かに純粋にポインタを使う必要があるのか? と問われるとないかも知れませんね。(^^; 他の方の回答にあります、速度やサイズの制限がないのであれば使わなくても何ら問題ないような気がします。 関数に引き数を渡してその中身を変更する場合や、動的にメモリ確保する場合には必要になると思いますが、それ以外では使わなくてはならないということはありませんね。 質問者様がモジュール分割や出力引き数を持つ関数の実装、メモリの動的確保などを行おうとしたときに初めて必要になってくると思います。 それらを使わないのであれば覚えなくても良いかも(^^) 質問者様が職業プログラマや多人数でのプログラミングを目指しているのなら、恐らく必要になるでしょうから今のうちに覚えておいた方がよいでしょう。 何にしてももう少しプログラミング技法を学ぶと必要性が見えてくると思います。 ゲームを一個人で作る分には速度や何らかのサイズの問題がなければ要らないかも知れませんね。 駄文失礼しました。
- Interest
- ベストアンサー率31% (207/659)
ファイルを扱おうと思ったらファイルポインタを使わないと扱えません。 文字列を扱おうと思ったら、やはりポインタで文字列を扱います。(配列でも可能ですが。) 関数にデータを渡して、関数の中でデータを書き換えて返してもらおうと 思ったら、関数にそのデータへのポインタを渡してやる必要があります。 大きなデータを関数に引き渡すとき、ポインタを使わないと大きなデータのコピーを渡すことになるのでスタックの消費が大きく、受け渡しの時間も余分にかかります。ポインタを使えばすぐ渡せるのに。 条件によって実行する関数を切り替えたいときに、スマートなやり方として「関数へのポインタ」を使う方法があります。これを使うと if-else やswitch-caseをだらだら書かなくてもOK。 ハードウェアを制御する組み込み系の世界では、ハードウェアを操作するためにメモリ空間に直接アクセスする必要があるのでポインタがないとハードが動きません。
- genso-cake
- ベストアンサー率65% (23/35)
とりあえず、ポインタが何かはわかってらっしゃる様なので、 その辺の説明は割愛します。 ポインタのよいところは、高速化とメモリーの節約と思います。 関数に引数を渡すときのことを考えてみます。 C言語の言語仕様として、関数の引数で渡した変数は、 どんなに関数内でいじくりまわしても、呼び出し元では影響がしない。 というものがあります。 たとえば、f(int x){}という関数があったときて、 var = 1; f(var); として関数を読み出したとします。 関数から戻ってきたときvarの値は、f()の中でどんな計算をしても、 var = 1のままになっています。 これは、言語の仕様なので、そういうものだと認めてください。 さて、varをf()に渡しても、varの値が変化しないと言うことは、 メモリー上にvarの値を保存しておかないといけません。 というより実際は、逆に考えて、varのコピーを取っておいて、 それをf()関数はこねくり回すという方法をとります。 これで、お気づきと思いますが、値を渡すときには、 メモリーに1カ所の領域が必要で、コピー操作が1回必要になります。 上記の例の場合、intを1つでしたが、これが100個の配列だったらどうでしょう? int100個分の領域と、100回のコピー操作が必要になります。 非常に無駄なことを行っていると思いませんか? では、ポインタを用いた場合を考えてみます。 g(int Num , int* arr); というのが一般的な関数の形です。 (Numは配列の個数を明示するためです。TPOにあわせて使います) int a[100]; g(100,a); と関数g()を呼び出します。 g()関数を呼び出す場合、 100という数字のコピーと、配列aの開始番地をメモリーにコピーして、 関数を呼び出します。 コピー回数はたったの2回で、メモリーもint1個分と、 メモリーの番地1個分(機種とかでいろいろ変わるのですが、4バイトくらいかな) だけで済みます。 以上のように、ポインタを用いるとメモリーと速度が速くなります。 ポインタは難しい概念かもしれませんが、結構定石が多いので、 なれてくると、何も考えずにできるようになります。 たとえば、関数の宣言に*がついていたら、 配列なら何もつけずに、スカラー(普通の変数)なら&をつけるみたいな感じです。
- mainPC
- ベストアンサー率21% (62/287)
データを関数に渡す時、ポインタにしているとポインタのサイズ分(4byte)のメモリを消費しますが、ポインタを使わずにデータの実体で渡すと、データのサイズ分のメモリを消費してしまいます。 また、ポインタで渡すと、渡された関数内で変更した内容が実体に反映されていたりします。 ま、色々と使い道があります(^^;
お礼
質問内容は、 ゲーム制作には必要かどうかではなく、 詳しい効力についてお聞きしたいと言う事です。 変数同士でやり取りする時に、 実際のデータの代わりにポインタを使う事で、 必要な時に、メモリへ読み込んだりして容量を節約でき、 文字列を表示する時などにも使用される物なのですね。 2週間、質問を忘れていましたが、 皆さんお答えしてくださり誠に有難うございます。