• ベストアンサー

ポインタの疑問点

ポインタで分からないことがあります。 void swap(int* x, int* y){ int tmp; tmp = *x; *x = *y; *y = tmp; } /* int main(){ int *pA,*pB; *pA=5; *pB=10; cout << *pA << " , " << *pB <<"\n"; swap(pA,pB); cout << *pA << " , " << *pB <<"\n"; } */ int main(){ int a,b; a=5; b=10; cout << a << " , " << b <<"\n"; swap(&a,&b); cout << a << " , " << b <<"\n"; } 上のメイン関数ではエラーが起きます。どうしてなんでしょう? 下のと意味は同じだと思うのですが・・・

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

  • ベストアンサー
  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

全く違います。 int *pA この時点では、pAというint型のポインタが作成されるだけ。で、そのポインタには何も代入されていないのでどこも指し示していないのです。int型の変数は存在していません。 int a; int *pA; としてから pA=&a; とすれば、pAにaのアドレスが代入されるので*pAが求められますけど、pAに何も代入されていない状態では*pAはもとめられません。

mwlsm
質問者

お礼

ポインタってややこしいですね・・・ 長時間かかりましたがようやく分かりました。ありがとうございます。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

#3です。 >pAとpBは関数内部のローカル変数です。 内部なんだからローカルであるのは当たり前ですね。 関数内部の自動変数です、が正しいです。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

どこの場所も指していない、というのは不正確です。 正確には「どこを指しているかわからない」です。 どこの場所も指していない、というのは、 pA = NULL; pB = NULL; の場合です。 今回、pAとpBは関数内部のローカル変数です。 したがって、定義時に何が入っているか(つまり、どこを指しているか)は保証できません。

mwlsm
質問者

お礼

厳密にはそうなんですね。ありがとうございます。

  • qbr2
  • ベストアンサー率50% (62/123)
回答No.2

ポインタは、「場所」を記憶しているものです。 それは、お解かりでしょうか? 「int *pA,*pB;」と宣言したタイミングでは、 pA,pBがどこの場所も指していない状態になっています。 なので、*pA=5;と言われても、どこに5を代入するんだよ?? って、エラーになります。 「int a,b;」 は、aとbをどこかの場所に置く。という意味です。 &aと書くことで、どこに置いたのか?を取得できます。 int a,b int *pA,*pB; pA=&a; pB=&b; *pA=5; *pB=10; とすると、a,bがどこかに置かれて、 その場所が、pA,pBに代入されるので実行できます。

mwlsm
質問者

お礼

ポインタってややこしいですね・・・ 長時間かかりましたがようやく分かりました。ありがとうございます。

関連するQ&A

専門家に質問してみよう