2016-06-09 3 views
0
#include<stdio.h> 
void mystery(int *ptra, int *ptrb) 
{ 
    int *temp; 
    temp = ptrb; 
    ptrb = ptra; 
    ptra = temp; 
} 
int main() 
{ 
    int a=2016, b=0, c=4, d=42; 
    mystery(&a, &b); 
    if (a < c) 
     mystery(&c, &a); 
    mystery(&a, &d); 
    printf("%d\n", a); 
} 

내가 포인터를 이용하여 변수의 값을 교환하려고 시도하고 있지만이 기능은포인터를 사용할 때도 내 코드가 변수의 값을 바꿀 수없는 이유는 무엇입니까?

+0

* temp -> temp 그리고 void가 아닌 함수에 반환 값을 할당하십시오. – mssirvi

+0

이 코드는 이미 SO에서 이미 완전히 중복 된 다수의 것으로 판단 할 때 책에서 나온 것입니다. 질문을하기 전에 조사를 해보십시오. – Lundin

답변

4

당신이 지적되고 내용을 변경해야 호출 후에도 변수가 같은 값을 포함하는 이유를 이해하지 못하는 포인터 자체는 포인터가 아니라 포인터를 가리 킵니다. 당신이 포인터 자체를 변경하는 경우 변수 ptraptrb이 주소를 보유 지역 변수이기 때문에

void mystery(int *ptra, int *ptrb) 
{ 
    int temp; //make it non-pointer also. 
    temp = *ptrb; 
    *ptrb = *ptra; 
    *ptra = temp; 
} 

는 변화는 함수에 지역이 될 것입니다.

  • 포인터 자체
  • 개체에 대한 포인터 점, 즉 내용 :

    는 포인터를 처리 할 때, 일반적으로 관련 객체가 있다고 일반적으로, 기억하십시오. 귀하의 경우에는

, 당신은 포인터 이 아닌 내용 — 및 자체는 변화가 변수가 함수에 로컬 포인터에 왜 값, 통과 있는 포인터를 처리하고 있습니다.

또한 작업을 수행하는 이미 std::swap이 있습니다. 당신이 그것을 모르는 경우에 대신 그것을 사용하십시오. 당신의 mystery 기능 내부

+0

포인터가 가리키는 주소를 변경해도 주소에 포함 된 값에 영향을 미치지 않습니까? –

+1

주소가 값으로 전달되었으므로 아니요. – drescherjm

1

이 표기법은 당신이 실제로 값에 액세스하는 데 사용할 필요 한 것은 포인터 포인트가되는 : 포인터를 역 참조

*ptra 

를 불리는 그. 나는 그 대답에 대해 낡은 대답이있다. here.

그래서 :

void mystery(int *ptra, int *ptrb) 
{ 
    int temp = *ptrb; 
    *ptrb = *ptra; 
    *ptra = temp; 
} 
0

당신은 포인터가 가리키는 변수의 값을 교환하지 않지만 대신 주소를 교환한다.

포인터 대신 * 주소 대신 값을 사용하십시오.