- ベストアンサー
ポインタを利用する理由とは?
C言語には「ポインタ」というものが出てきますよね。 テキストで「ポインタ」の章をずらすら~と読んでいるうちになんでこんなめんどい事しなきゃならないのかなぁと思ってきて疑問に思ってきました。 関数で引数として「アクセス番号」にしなくても、直接「値」を渡せばいいと思うのですが。 ポインタの利用する理由と、その利用法をおしえてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
アドレス渡しには立派な存在意義があるからです。 値渡しは、対象の変数をそっくりコピーしたものが移動します。 1つの要素が何MBもある巨大な配列や構造体を、 そっくり値渡しすることを考えてみてください。 ましてや、それがforループなどで何度も繰り返されでもした日には。 その処理のパフォーマンスたるや、想像するだに恐ろしいことになる筈です。 ポインタの真価は、こんな場合に発揮されます。 ポインタ変数を使って参照すれば、どんなに巨大な配列だろうと 渡されるのは各行の先頭のアドレスだけです。 何MBもあるデータが、そっくり移動したり何度もコピーされたり。 そんな手間をかけることなく、直接大元の配列の任意の位置だけを 最低限のアクセスで呼び出したり書き換えたりできるのです。 入門用の参考書に載っているような小さなプログラムでは 今ひとつ有難味がわからないと思いますが、 巨大かつ複雑なプログラムで高速な処理を行いたい場合には、 ポインタを抜きにしては語れません。
その他の回答 (5)
- jacta
- ベストアンサー率26% (845/3158)
> ポインタの利用する理由と、その利用法をおしえてください。 機械語では、僅かな例外を除いて、ポインタと同様の仕組みを用いてメモリへのアクセスを行います。ですから、ポインタというのは最も素直に設計された言語仕様なのです。 そうした素直な設計を捨てて、より高級な仕様のみにすることもできますが、そのための代償はあまりにも大きいのです。
お礼
能率がよくかつ、高速な処理が必要となるゲームプログラムではポインタは不可欠であることが今回わかりました。まだまだC言語は土素人ですが、今後またあったらおしえてください。今回はありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
strcpyって文字列をコピーする関数があるでしょ。 あれの引数はポインタですよ。 char *strcpy( char *strDestination, const char *strSource ); char str2[50]; char str1 = "あいうえお" 問)文字列str1をstr2にコピーしなさい。 正解: strcpy(str2,str1); 間違った答え: str2 = str1;
お礼
テキストの配列の章にそれが載ってました。早速実習してみようと思います。 ありがとうございます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>関数で引数として「アクセス番号」にしなくても、直接「値」を渡せばいいと思うのですが。 例えば、構造体のような大きい"値"とか、何キロバイトもあるような文字列を"直接「値」"で渡すとスタックが圧迫されます。 「値」でなく参照元の変数を直接変更したい場合などがあります。
お礼
なるほど、巨大なデータ量の値をいちいち引き渡していたら、それこそ早い処理が要求されるゲームプログラムでは実現できませんよね。 このポインタに疑問を持ち始めたのは先日、サンプル用に公開されていた「○×ゲーム」のソースプログラムを見てから。そのとき多数のポインタが使用されていて、反対に製作者が混乱するのではないかと思ったからなのですが、ようやく、ポインタを利用する本当の理由が見えてきた気がします。 完全にマスターして、高速でかつ能率の良いアルゴリズムのゲームプログラムを作成したいと思います。 今後能率のよくかつ高速なアルゴリズムのゲームめざし作成でまだ検定でも出てこなかったCのなんらかが出てくると思います。そのときはまたよろしくお願いします。 ありがとうございました。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
本を読んで、あるいは説明を聞いて「なるほど!」と思える場合、たいていはその説明を見る/聞く前にそれが使えないことによる不便を実感しているものです。 質問者さんが今のところまだポインタの有用性を良くお分かりにならないのは、ポインタであれば便利だという局面をまだ体験していないからです。例題のために作られた人工的な例では、なかなか実感できるものではありません。 ですので、「ポインタというものがある」とだけ覚えておいて、ひとまずポインタを使わずに学習を進めていくほうが(それが可能であれば)よろしいかと思います。そのうちに、なんでこういうことができないんだろう、こういうことができれば便利なのに、と思う局面が現れます。そのときに振り返ってポインタの学習をすれば、きっと合点が行くと思います。 そういう局面が訪れないとすれば、質問者さんにとってポインタは必要ないということですので、学ぶ必要もないわけです。使い方によっては、実際、そういう人もいるかもしれません。それはそれで、別に悪いことではありません。
お礼
図書館の一般の人は入れない書庫の片隅にポインタについて徹底的に解説した本をみつけました。(当分返せないかも…)アマゾンでも買った人はみな私と同じ考えを抱くひとみたいで読んだ人はポインタについて非常に理解できたと好評のようです。私も早速読んでみます。 どうもありがとうございました。
補足
ゲームプログラムを作成する事とC言語検定の対策としてどうしても理解しなければなりません。 特にゲームプログラミングとなるとより高速かつ効率のよりアルゴリズムを考えなくてはいけない以上、ポインタについて知っておくべきだと思うのです。 #1さんの本ほしいのですが、実はもうすぐゲームプログラミングの実習が本格的になるのでゲームプログラムのリファレンスをと、あちこち買い込んでお金がスッカラカンなんです。。_| ̄|○
- lovely_corgi
- ベストアンサー率37% (164/442)
私はポインタが苦手でしたが、この本をじっくり読んで ポインタの便利さに感動しました^^ まずはこの本を読まれることをお勧めします。 ポインタがわかると、俄然プログラミングがラクになります。 #くどくど説明するのが苦手なだけですが;;
お礼
図書館の一般の人は入れない書庫の片隅にポインタについて徹底的に解説した本をみつけました。(当分返せないかも…)アマゾンでも買った人はみな私と同じ考えを抱くひとみたいで読んだ人はポインタについて非常に理解できたと好評のようです。私も早速読んでみます。 どうもありがとうございました。
お礼
なるほど、巨大なデータ量の値をいちいち引き渡していたら、それこそ早い処理が要求されるゲームプログラムでは実現できませんよね。 このポインタに疑問を持ち始めたのは先日、サンプル用に公開されていた「○×ゲーム」のソースプログラムを見てから。そのとき多数のポインタが使用されていて、反対に製作者が混乱するのではないかと思ったからなのですが、ようやく、ポインタを利用する本当の理由が見えてきた気がします。 完全にマスターして、高速でかつ能率の良いアルゴリズムのゲームプログラムを作成したいと思います。 ありがとうございました。