일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 슈퍼탱크럼블
- 공략
- 설계도
- 가톨릭
- 해설
- 잡담만설
- NICU
- 버스시간표
- 전산직
- 해남종합버스터미널
- 천주교
- 컴퓨터일반
- 슈퍼탱크대작전
- c언어
- 추가채용
- 일기처럼 보이는 뻘글
- 일상
- swap
- 일기처럼 보이는 잡글
- 말씀새기기
- 정보보호론
- 육아일기
- 정보
- 광주-해남
- 반복문
- 티스토리챌린지
- 끄적끄적
- 해남버스터미널
- Lover
- 오블완
Archives
- Today
- Total
리안이와 함께하는 세상
임시공간 할당(call by referrence)에 의한 SWAP함수 알고리즘 설명 본문
일단 무슨 알고리즘이든, 포인터가 들어간 알고리즘은 머리를 복잡하게 만드는것이 일반적입니다.
SWAP알고리즘 또한 함수로 구현하게 되면, call by referrence 에 의한 값의 이동이 일어나기 때문에 쉽사리 머리로 이해하기가 쉽지 않습니다. (call by referrence는 포인터를 필연적으로 사용하게 됨)
이번에는 이 임시공간 할당에 의한 SWAP알고리즘에 대해서 이해해 보도록 합시다.
값 전달( call by referrence )은 값을 복사해서 함수로 전달하기 때문에, 바꾸고자 하는 값을 변경할 수 없습니다. 포인터를 이용하면 값을 넘겨받지 않고, 값이 저장되어 있는 주소를 인자로 넘겨받아 해당 주소를 직접 참조하여 값을 변경시킬 수 있습니다.
예를 들어서, A와 B라는 공간에 저장된 1이라는 값과 2라는 값이 있습니다.
이 값을 그냥 call by value로 함수에 전달하게 되면 1과 2라는 값이 C와 D라는 공간에 복사되어 함수로 넘겨지고, 함수에서 연산이 이루어 진 뒤, C와 D의 값만 변화되고, 함수가 종료되면 C와 D라는 저장공간은 사라지게 되므로 아무런 변화도 일어나지 않습니다. 즉 ( m : n 을 변수 m에 저장된 값 n이라고 할때) A : 1, B : 2, C : 1, D : 2가 되므로 원래 값과 함수에서 처리한 값 사이에는 아무런 관계가 없는 것으로 나타납니다.
반면에, 이 값을 call by referrence로 전달하게 되면, 1과 2가 저장되어 있는 공간의 주소 값인 A와 B가 새로운 공간 C와 D에 저장됩니다. 즉 C : A, A : 1 , D : B, B : 1이 됩니다.
따라서 여기에서 역참조 연산자(*)를 사용하여 C값을 참조하게 되면, C의 값인 A를 따라 우리가 변화 시키고 싶어 했던 1이라는 원본 값에 도달하게 됩니다.
SWAP함수를 작성하는 1단계는 함수를 정의하는 것 입니다.
1. 반환하는 값이 없습니다.
2. 넘겨받는 값은 주소입니다.
1번은 함수의 반환형을 암시하고, 2번은 매개변수의 자료형을 암시합니다.
위의 명세에서와 같이 반환형은 void형이됩니다. 자료형은... 잠시 혼란이 오실 수 있겠네요. 일반적으로 C언어에서 주소값을 저장할 때에는 포인터를 이용합니다. 또, int형 자료를 저장하는 주소를 가르켜야하기 때문에 int* 형이 되어야 겠죠. 따라서 매개변수의 자료형은 int*형이 됩니다.
>
void swap(int* x, int* y);
이번엔 구현부분을 살펴봅시다.
주소 값을 넘겨받았기 때문에 값을 참조할 때는 역참조연산자(*)를 사용합니다. 일단, 한 값을 임시 저장할 변수를 생성합니다. 주소 값을 저장하게되므로 자료형은 int* 형이됩니다. ( int* temp; )
이번에는 연산을 수행합니다.
>
int* temp;
*temp = *x;
*x = *y;
*temp = *x;
*x = *y;
*y = *temp;
이제 함수 호출 부분을 봅니다.
함수를 호출할 때 매개변수로 주소값을 넘겨주어야 하기 때문에, 주소연산자(&)를 사용합니다.(주소 연산자는 변수의 주소 값을 리턴합니다.)
>
함수를 호출할 때 매개변수로 주소값을 넘겨주어야 하기 때문에, 주소연산자(&)를 사용합니다.(주소 연산자는 변수의 주소 값을 리턴합니다.)
>
swap(&a, &b);
이렇게 하여 주소값전달에 의한 swap알고리즘에 대해 알아보았습니다.
처음 생각할 때는 어렵지만, 한번 이해하고나면 간단한 문제 입니다.
'STUDY ! > 잡다한 지식' 카테고리의 다른 글
샵메일(#mail)? 이게 뭐지?.Araboza (0) | 2018.01.30 |
---|---|
SWAP 알고리즘 (0) | 2010.02.27 |
선택정렬 알고리즘 (0) | 2010.02.27 |
[C] ' ' , " " (0) | 2009.10.18 |
AMD CPU에서 Matlab 실행시키려면 ? (0) | 2009.09.12 |