0

ポインターを使用していくつかの整数を交換しようとしていますが、何らかの理由で何が起こっているのか完全に理解していません。

cout<< "x: " << x <<endl;
cout<< "y: " << y <<endl;

temp = *p2;
*p2 = *p1;
*p1 = temp; 

cout<< "x: " << x <<endl;
cout<< "y: " << y <<endl;

取得する出力は次のとおりです。 x: 0 y: 99 x: 0 y: 0

ありがとう

編集:それが問題のある領域だと私が信じていることです。コード全体は、一連のポインター タスクです。

#include <iostream>
using namespace std;

void swap(int *x, int *y);
void noNegatives(int *x);
int main ()
{
int x,y,temp;
int *p1, *p2;

p1 = &x;
*p1 = 99;

cout << "x: " << x << endl;
cout << "p1: " << *p1 << endl;

p1 = &y;
*p1 = -300;

p2 = &x;
temp = *p1;  
*p1 = *p2;
*p2 = temp;

noNegatives(&x);
noNegatives(&y);

p2=&x;
cout<< "x: "<<*p2<<endl;
p2=&y;
cout<< "y: "<<*p2<<endl;

int a[1];  
p2 = &a[0];
*p2 = x;
cout << "First Element: " << p2<< endl;

p2 = &a[1];
*p2 = y;
cout << "Second Element: " << p2<< endl;

p1 = &a[0];
p2 = &a[1];

cout<< "x: " << x <<endl;
cout<< "y: " << y <<endl;

temp = *p2;
*p2 = *p1;
*p1 = temp;

cout<< "x: " << x <<endl;
cout<< "y: " << y <<endl;

cout << "First Element: " << a[0]<< endl;
cout << "Second Element: " << a[1]<< endl;

swap(&x,&y);
cout<< "x: " << x <<endl;
cout<< "y: " << y <<endl;


swap(&a[0], &a[1]);
cout<< "a[0]: " << a[0] <<endl;
cout<< "a[1]: " << a[1] <<endl;
}

void noNegatives(int *x)
{
    if(*x<0)
            *x=0;

}

void swap(int *p1, int *p2)
{
    int temp;

    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

私の目標は、最後の x と y が x: 99 と y: 0 になることです。それ以外はすべて正常に機能します。

なんてこった、それが配列だったことを気にしないでください。そのボーンヘッドエラーをキャッチしていただきありがとうございます。

4

2 に答える 2

3

これはかなり悪いニュースです:

int a[1];

1 つではなく 2 つの要素が必要です。現在定義しているように、読み取りまたは書き込みa[1]は配列の末尾を超えており、未定義の動作になります。

これを行う:

int a[2];

// etc...

p1 = &a[0];
p2 = &a[1];
于 2013-10-02T03:00:27.263 に答える
2

と仮定するp1と、あなたはそれを視覚化することができますp2xy

あなたはあなたの3つの変数を持っています

           temp [ ]

    *p1 [ x ]        *p2 [ y ]

切り替えたいのですが*p1*p2最初に切り替えます

temp = *p2

           temp [ y ]
                  ^
                  |________
                            \
    *p1 [ x ]          *p2 [ y ]

それから

*p2 = *p1

               temp [ y ]

     *p1 [ x ] ----------> *p2 [ x ]

それから

*p1 = temp

               temp [ y ]
                     /
          /----------
          V
    *p1 [ y ]                  *p2 [ x ]

そして今、あなたはそれを見て*p1*p2切り替えられています。

于 2013-10-02T02:56:23.813 に答える