두 변수의 값 바꾸기
두 변수의 값 바꾸기는 '포인터'를 배우는데 항상 등장하는 예제이다.
예를들면, 상자안에 서로 다른 과일이 있다고 가정하자.
쉽게 생각 했을 때 상자속에 과일을 꺼내서 다른 상자로 집어 넣으면 된다.
그러나 프로그래밍에서는 위와 같은 동작이 한번에 일어나지 못하므로
임시 변수에 값을 저장해 주어야한다.
1. 잘못된 스왑(Swap) 방법
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 | #include<stdio.h> int swap(int num1, int num2); int main() { int num1, num2; scanf_s("%d %d", &num1, &num2); swap(num1, num2); printf("%d %d \n", num1, num2); return 0; } int swap(int num1, int num2) { int temp=0; temp = num1; num1 = num2; num2 = temp; return 0; } | cs |
예제를 통해 왜 포인터가 필요한지 알아보자
위의 코드는 잘못된 스왑이다. swap 함수를 만들었지만
num1과 num2는 전역변수가 아니므로
함수내부의 num1, num2는 파라미터로 전달받은 값일뿐
main 내부의 num1, num2와 전혀 관련이 없다.
따라서 아무리 swap 함수 내부에서 연산을 했다고 하더라도
값이 반환됨과 동시에 의미가 없어진다.
그러므로 main 함수 내의 num 변수들이 사는 주소를 콕 찝어줘야하는데
이때 사용되는 것이 '포인터'이다.
2. 포인터를 이용한 스왑(Swap)
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 | #include<stdio.h> int swap(int num1, int num2); int main() { int num1, num2; scanf_s("%d %d", &num1, &num2); swap(&num1, &num2); printf("%d %d \n", num1, num2); return 0; } int swap(int *num1, int *num2) { int temp=0; temp = *num1; *num1 = *num2; *num2 = temp; return 0; } | cs |
1번의 예제와 다른 점은 num1과 num2의 메모리 주소를 반영했다는 것이다.
즉, 포인터 값을 파라미터로 사용한다.
따라서 직접적인 메모리 주소값을 가지고 변수의 값이 변하며
이는 함수가 종료에 상관없이 연산이 가능해진다.
예제에 "&"과 "*"이 등장하는데
& - 해당 변수의 주소값
* - 해당 변수 주소에 저장된 실제값
이라고 생각하면 된다.
3. 배열의 두 원소 바꾸기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<stdio.h> int swap(int num1, int num2); int main() { int arr[5] = {12,15,26,24,52}; swap_arr(&arr, 0,4); printf("%d %d \n", arr[0], arr[4]); return 0; } int swap_arr(int *arr[], int i, int j) { int temp=0; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; return 0; } | cs |
위의 예제를 활용하여 하나의 배열 내부 원소값도 바꿀수 있다.
포인터 사용에 대해 잘 몰라서 main 함수 내부에 swap 함수를 넣었다면
앞으로는 함수화해서 사용하길 바란다.
'알고리즘 문제풀이' 카테고리의 다른 글
[알고리즘] 큐(Queue)를 이용한 대기번호 (0) | 2017.04.18 |
---|---|
[알고리즘] 배열의 범위 회전 (0) | 2017.04.18 |
[알고리즘] 배열의 최대값 구하기 (0) | 2017.04.18 |
[알고리즘] 최대최소 (0) | 2017.04.18 |
[알고리즘] C언어 배열을 활용한 Stack 구현 (2) | 2017.04.18 |
댓글