변수값바꾸기 ..이상하네요.

zxcvbnm의 이미지

이게 왜 안바뀌죠..

#include <stdio.h>

void revertvalue(int *i, int *j)
{
int *tmp;
tmp=i;
i=j;
j=tmp;
}

void main()
{
int i,j;
i=10;
j=20;
printf("before i=%d , j=%d\n", i, j);
revertvalue(&i,&j);
printf("after i=%d , j=%d\n", i, j);

}

결과
before i=10 , j=20
after i=10 , j=20

최병현의 이미지

사소한 실수를 하신 것으로 보입니다.

zxcvbnm wrote:
void revertvalue(int *i, int *j)
{
        int *tmp;
        tmp=i;
        i=j;
        j=tmp;
}

다음과 같이 수정하시면 원하시는 대로 될 것 같습니다.

void revertvalue(int *i, int *j)
{
        int *tmp;
        *tmp=*i;
        *i=*j;
        *j=*tmp;
}

이렇게 하셔도 될 것 같구요

void revertvalue(int *i, int *j)
{
        int tmp;
        tmp=*i;
        *i=*j;
        *j=tmp;
}

그런데 원하시는 것이 변수의 주소를 바꿔치기 하여 값이 바뀐 것처럼 보이도록하는 것이라면 revertvalue()의 선언은 원래 사용하시던 것이 맞고 main()내 i, j에 대한 선언이 달라져야 할 것입니다.

To be a rich

icristi의 이미지

void main() 
{ 
int i,j; 
i=10; 
j=20; 
printf("before i=%d , j=%d\n", i, j); 
revertvalue(&i,&j); 
printf("after i=%d , j=%d\n", i, j); 

} 

miain에 선언한 처음의 int 형의 두 변수는 지역변수 이므로 콜바이 레퍼런스로 전달하였다 하여도 외부에서 포인터 자제를 바뀔 수 없을 것입니다.

void main() 
{ 
int* i = (int*)malloc(1); 
int* j = (int*)malloc(1); 
*i=10; 
*j=20; 
printf("before i=%d , j=%d\n", *i, *j); 
revertvalue(i,j); 
printf("after i=%d , j=%d\n", *i, *j); 
} 

코드를 이렇게 바꾼다면 님이 의도한 데로 잘 될것입니다.(테스트는 안해봤어용~)

-----------------------------------

오.. 이거 테스트 해보니까 제가 잠시 착각했다는 걸 깨달았습니다.
이렇게 해봤자 어차피 retvertValue() 에서는 포인터 스왑 자체가 지역변수놀이가
되어버려서 바뀐게 적용이 안되는 거네요.
실수!~

위의 코드는 잘못된 코드 입니다.

dhjung의 이미지

최병현 wrote:
다음과 같이 수정하시면 원하시는 대로 될 것 같습니다.
void revertvalue(int *i, int *j)
{
        int *tmp;
        *tmp=*i;
        *i=*j;
        *j=*tmp;
}

위의 코드는 잘못됐습니다.. 사용하지 마시길..

최병현 wrote:

이렇게 하셔도 될 것 같구요
void revertvalue(int *i, int *j) 
{ 
        int tmp; 
        tmp=*i; 
        *i=*j; 
        *j=tmp; 
}


위 처럼만 사용하시길...


--------------------------
Donghyun Jung