プロが教える店舗&オフィスのセキュリティ対策術

ポインタで分からないことがあります。

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";
}

上のメイン関数ではエラーが起きます。どうしてなんでしょう?
下のと意味は同じだと思うのですが・・・

A 回答 (4件)

#3です。


>pAとpBは関数内部のローカル変数です。

内部なんだからローカルであるのは当たり前ですね。
関数内部の自動変数です、が正しいです。
    • good
    • 0

<br /> どこの場所も指していない、というのは不正確です。<br /> 正確には「どこを指しているかわからない」です。<b

この場所も指していない、というのは、
pA = NULL;
pB = NULL;
の場合です。

今回、pAとpBは関数内部のローカル変数です。
したがって、定義時に何が入っているか(つまり、どこを指しているか)は保証できません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/17 15:57

ポインタは、「場所」を記憶しているものです。


それは、お解かりでしょうか?

「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に代入されるので実行できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/17 15:55

全く違います。



int *pA

この時点では、pAというint型のポインタが作成されるだけ。で、そのポインタには何も代入されていないのでどこも指し示していないのです。int型の変数は存在していません。

int a;
int *pA;
としてから
pA=&a;
とすれば、pAにaのアドレスが代入されるので*pAが求められますけど、pAに何も代入されていない状態では*pAはもとめられません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/17 15:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!