-PR-
解決済み

ポインタいついて教えてください

  • すぐに回答を!
  • 質問No.66485
  • 閲覧数42
  • ありがとう数9
  • 気になる数0
  • 回答数4
  • コメント数0

ポインタがわかりません。
教えてください。
下の二つは、共に「100」を表記すると思いますが、
どこがどのように違うのですか。

また、f1()という関数をつくって、ここで
scanfを使って、5つぐらい値を代入させて、
他の関数でこの値を使おうと思っています。
この場合下のどちらを使うのが、よろしいのでしょうか。

よろしくお願いします

#include <stdio.h>

int main(void)
{
int *p, q;

q = 100; /* q に100を代入 */

p = &q; /* p にq のアドレスを割り当てる */

printf("%d", *p);

return 0;
}



#include <stdio.h>

int main(void)
{
int *p, q;

p = &q; /* q のアドレスを得る */

*p = 100; /* ポインタを使ってq に値を代入する */

printf("%d", q);

return 0;
}
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル12

ベストアンサー率 40% (230/562)

無駄なことをやっているように見えますが、これはこのようにする必要があるのでしょうか。
これではポインタを使っている意味が、とくにないでしょう。

int main(void){

int q;
q = 100; /* q に100を代入 */
printf("%d", q);
return 0;

}

このようにできない理由は?
レポート課題?
ただただポインタを使ってみたかった?


ちなみに、あえてどちらの場合が有効かについて。
int変数とポインタ変数に必要な容量は、両方とも4バイトです。
よって、コピーにかかる時間はいっしょです。
intでなくdoubleにすれば、ほんの少し変わるかもしれません。


本当にポインタについて勉強したかったら、ポインタについて解説した本がいくつかあるので、1冊買ったらどうでしょう。
もしくは、オンラインヘルプと数ヶ月にらめっこするだけで、結構わかることもありますよ。
補足コメント
noname#142904

haporunさんレスありがとうございます。
ただただポインタを使ってみたかった?
そうなんです。ポインタを理解したいだけです。

はじめに書きましたが、scanfで値を入力させて他の関数でその値を使いたいのですが、
retutnで返せるのは、一つだけらしいので、ポインタを使おうと思いました。
また、グローバル変数にすれば簡単ですが・・・。
もちろん、今やろうとしていることも、
別にmain関数だけでかけますが、ポインタを理解するためにやっています。

これは、独習Cから抜粋しただけです。
レポートではありません。独学なので。
よろしくお願いします。
投稿日時 - 2001-04-21 18:22:05
お礼コメント
noname#142904

haporunさん、ごめんなさい。
補足の所に書いてしまいました。
>コピーにかかる時間はいっしょです。
ほとんどいっしょですか。
なんとなく解ってきました。
もっと勉強してきます。
ありがとうございました。
投稿日時 - 2001-04-21 19:22:40
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.4
レベル11

ベストアンサー率 61% (157/255)

deagleさんへ。
上のソースも下のソースも特に問題ないのでは?

両者のポインタp は実際に使用される前に、
両方とも、&qが代入されていますよ。

ただ、deagleさんのおっしゃるように、C/C++は何を指しているかわからないポインタにも値自体は代入できてしまう上、半々ぐらいの確率で実行が成功したり、プログラムがフリーズしたり、OSごと跳んだりするというすごい仕様になっていますので、その点には注意が必要です。
お礼コメント
noname#142904

kokucho81さん、またレスありがとうございます。

>両者のポインタp は実際に使用される前に、
>両方とも、&qが代入されていますよ。
注意したいと思います。

レスをつけてくださった皆様へ
いろいろと試してみて、力をつけたいと思います。
ありがとうございました。
投稿日時 - 2001-04-21 20:43:31


  • 回答No.2
レベル11

ベストアンサー率 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(...)などというように、値が変更されると言うことが明示的にわかる関数名としておきましょう。
お礼コメント
noname#142904

kokucho81さん、レスありがとうございます。
例まで書いていただきまして、ありがとうございました。
いろいろと試してみます。
投稿日時 - 2001-04-21 20:20:50
  • 回答No.3

 あ。下のソースは駄目です。希にプログラムがハングアップします。

 変数というのは値を入れた「箱」であり、ポインタは「その箱がどこにあるか」を書いたメモです。
 ところが、宣言したばかりのポインタにはどんな値が入っているか分かりません。
 そのポインタ変数に値を入れると、「どんな値か分からない」値がアドレスとして使用され、それが偶然にもシステム領域のど真ん中だった場合、こんな簡単なプログラムがシステムメモリを破壊して場合によってはフリーズします。

 上のソースは「ポインタ(メモ)にアドレスを書き込む」という動作をしているので問題ありませんが、下は「どこだかよく分からないアドレスに値を書き込む」という動作なので大変危険です。

 ちなみにポインタの概念は、C言語を勉強する人が必ず通り壁ですので、すぐには理解できなくても不思議はありません(^_^;
 上記の説明で分からないところがあったら補足してください。
お礼コメント
noname#142904

deagleさん、レスありがとうございます。
とても解りやすかったです。
投稿日時 - 2001-04-21 20:37:51
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ