본문 바로가기

프로그래밍/공부관련

포인터 문제 가지고놀기

c를 배우자 카페에서 사람들이 문제를 내고 댓글로 소스올려서 맞추고를 한다.
문제는 int형 변수2개 10,20 초기화 -> 포인터변수 2개만들어서 위의 int형 2개를 각각 가리키고
-> 더블포인터 변수 2개만들어서 포인터2개가 각각 가리키게 이것을 만족후

더블포인터를 이용하여 두변수의 값을 서로바꾸어라.. 함수사용 제한없음

그리하여 많은 댓글중 다른방법은 없을까?하여 레퍼런스를 한번 가지고놀기를 해봤다.


#include <cstdlib>
#include <iostream>

using namespace std;

void SwapInt(int& ref1, int& ref2)
{
     int Set = 0;
     int& temp = Set;
     temp = ref1;
     ref1 = ref2;
     ref2 = temp;
}

int main(int argc, char *argv[])
{
    int iA = 10, iB = 20;
    int *pA, *pB;
    int **ppA, **ppB;
   
    pA = &iA;  
    pB = &iB;
   
    ppA = &pA;
    ppB = &pB;
   
    cout<<**ppA << " " <<**ppB << endl;
    SwapInt(**ppA, **ppB);
    cout<<**ppA << " " <<**ppB << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

결과
10 20
20 10


음........ 레퍼런스를 한번 써봤는데 재미있었다.
다만 swap함수에서 왜 별도의 Set라는 변수를 적용시켰냐하면
Set없이 바로 값을 대입 그러니까
인자 ref1 , ref2   (즉 10, 20을 넣는셈)
int& temp = ref1;  -----------1
ref1 = ref2;          -----------2
ref2 = temp;        -----------3

하면 결과
10 20 -> 20 20 이되버린다.
고민하던중.. 그렇다. 저거 1번위치를 보면 temp 하고 ref1하고 주소값이 같아진거다.
그래서 2번위치에서 ref1에 20이 들어가고 양쪽다 20 20상태가 되겟고 
3번에서 temp가 10이라는 착각을 하였던 것이다. temp는 이미 바뀐 ref1 즉 20이들어가있는 상태인것이다.

잼있다.