2013-10-02 70 views
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 其他一切工作,因爲它應該。

噢,我的上帝永遠不知道它是陣列。非常感謝你捕捉到那個骨頭錯誤。

+0

如何三個變量初始化? – pickypg

+0

你能發佈完整的代碼嗎? – Pradheep

回答

3

這是非常糟糕的消息:

int a[1]; 

你要2個元素,而不是1作爲當前已定義它,閱讀或書寫a[1]過去是數組的結束,同時也有不確定的操作。

這樣做:

int a[2]; 

// etc... 

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

a [0]和a [1]不會足夠嗎?等待噢,我的上帝,我剛剛意識到我寫了什麼 –

+1

我認爲你現在明白了錯誤? =) – paddy

+0

@ user2272467如果這個答案對你有幫助,plz點擊複選標記並將其標記爲已回答 – Kal

2

假設p1p2xy u能想像它這樣

u有UR 3個瓦爾

  temp [ ] 

    *p1 [ x ]  *p2 [ y ] 

,我們要切換*p1*p2首先我們做

temp = *p2 

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

then

*p2 = *p1 

       temp [ y ] 

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

然後

*p1 = temp 

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

,現在你看到的是*p1*p2切換。

+0

優秀的圖案ans –

+2

這是一個非常好的插圖,但它不能解釋爲什麼OP的代碼不起作用。 – lurker

+0

@mbratch他編輯它的問題是交換是如何工作的,我回答說 – Kal