- ベストアンサー
ポインタについての要約
- ポインタについての要約文1
- ポインタについての要約文2
- ポインタについての要約文3
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
無駄なことをやっているように見えますが、これはこのようにする必要があるのでしょうか。 これではポインタを使っている意味が、とくにないでしょう。 int main(void){ int q; q = 100; /* q に100を代入 */ printf("%d", q); return 0; } このようにできない理由は? レポート課題? ただただポインタを使ってみたかった? ちなみに、あえてどちらの場合が有効かについて。 int変数とポインタ変数に必要な容量は、両方とも4バイトです。 よって、コピーにかかる時間はいっしょです。 intでなくdoubleにすれば、ほんの少し変わるかもしれません。 本当にポインタについて勉強したかったら、ポインタについて解説した本がいくつかあるので、1冊買ったらどうでしょう。 もしくは、オンラインヘルプと数ヶ月にらめっこするだけで、結構わかることもありますよ。
その他の回答 (3)
- kokucho81
- ベストアンサー率61% (157/255)
deagleさんへ。 上のソースも下のソースも特に問題ないのでは? 両者のポインタp は実際に使用される前に、 両方とも、&qが代入されていますよ。 ただ、deagleさんのおっしゃるように、C/C++は何を指しているかわからないポインタにも値自体は代入できてしまう上、半々ぐらいの確率で実行が成功したり、プログラムがフリーズしたり、OSごと跳んだりするというすごい仕様になっていますので、その点には注意が必要です。
お礼
kokucho81さん、またレスありがとうございます。 >両者のポインタp は実際に使用される前に、 >両方とも、&qが代入されていますよ。 注意したいと思います。 レスをつけてくださった皆様へ いろいろと試してみて、力をつけたいと思います。 ありがとうございました。
あ。下のソースは駄目です。希にプログラムがハングアップします。 変数というのは値を入れた「箱」であり、ポインタは「その箱がどこにあるか」を書いたメモです。 ところが、宣言したばかりのポインタにはどんな値が入っているか分かりません。 そのポインタ変数に値を入れると、「どんな値か分からない」値がアドレスとして使用され、それが偶然にもシステム領域のど真ん中だった場合、こんな簡単なプログラムがシステムメモリを破壊して場合によってはフリーズします。 上のソースは「ポインタ(メモ)にアドレスを書き込む」という動作をしているので問題ありませんが、下は「どこだかよく分からないアドレスに値を書き込む」という動作なので大変危険です。 ちなみにポインタの概念は、C言語を勉強する人が必ず通り壁ですので、すぐには理解できなくても不思議はありません(^_^; 上記の説明で分からないところがあったら補足してください。
お礼
deagleさん、レスありがとうございます。 とても解りやすかったです。
- kokucho81
- ベストアンサー率61% (157/255)
ポインタの概念そのものに関する勉強中なのですね。 そうですね。両者は同じ行動ですが、次のように全く同様に比較した方が良いでしょうね。 (1) int *p, q; p = &q; q = 100; printf("%d", *p); (2) int *p, q; p = &q; *p = 100; printf("%d", q); まぁ、同じですね。 >scanfを使って、5つぐらい値を代入させて、 とりあえず、例えば、 void foo (int a, int b, int c, int d, int e) { // a,b,c,d,eにscanfで値を代入する } という具合に5つほど、入力された値を変数に代入するということであれば、 void foo(int *a, int *b int *c int *d int *e) { // a,b,c,d,e は格納先を指すポインタ(のはず)である。scanfに&はいらない。 scanf ("%d%d%d%d%d",a,b,c,d,e); } int main(void) { int v1,v2,v3,v4,v5; foo(&v1,&v2,&v3,&v4,&v5); } と「ポインタ」を使用するか void foo(int &a, int &b, int&c, int &d, int &e) { // a,b,c,d,e は参照である。scanfに&が必要。 // scanf ("%d%d%d%d%d",&a,&b,&c,&d,&e); } int main(void) { int v1,v2,v3,v4,v5; foo(v1,v2,v3,v4,v5); } と「参照」(アドレス演算子ではないので注意を!)を使用するか です。 参照を使用したほうが「高速」で、「無駄なメモリも必要ない」ですが、 呼び出し側で「値渡し」との区別がつかない(値を渡すだけか、値が中で変えられてしまうのかは、作った本人以外は使ってみないとわからない)という弱点はあります。 それを補うためには、setValuesOf(...)などというように、値が変更されると言うことが明示的にわかる関数名としておきましょう。
お礼
kokucho81さん、レスありがとうございます。 例まで書いていただきまして、ありがとうございました。 いろいろと試してみます。
お礼
haporunさん、ごめんなさい。 補足の所に書いてしまいました。 >コピーにかかる時間はいっしょです。 ほとんどいっしょですか。 なんとなく解ってきました。 もっと勉強してきます。 ありがとうございました。
補足
haporunさんレスありがとうございます。 ただただポインタを使ってみたかった? そうなんです。ポインタを理解したいだけです。 はじめに書きましたが、scanfで値を入力させて他の関数でその値を使いたいのですが、 retutnで返せるのは、一つだけらしいので、ポインタを使おうと思いました。 また、グローバル変数にすれば簡単ですが・・・。 もちろん、今やろうとしていることも、 別にmain関数だけでかけますが、ポインタを理解するためにやっています。 これは、独習Cから抜粋しただけです。 レポートではありません。独学なので。 よろしくお願いします。