C 프로그래밍/9. 포인터
9.2 포인터와 함수, 포인터 사용의 장점
Recircle
2019. 6. 18. 18:40
함수 호출시 인수 전달 방식
-값에 의한 호출 : 본사본이 전달
-참조에 의한 호출 : 원본이 전달
값에 의한 호출
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 | #include <stdio.h> void swap(int x, int y); int main() { int a = 100, b = 200; printf("a=%d b=%d\n", a, b); swap(a, b); printf("a=%d b=%d\n", a, b); return 0; } void swap(int x, int y) // a,b 의 값을 복사하기 때문에 swap 함수 내부에서만 바뀐다. { int tmp; printf("x=%d y=%d\n", x, y); tmp = x; x = y; y = tmp; printf("x=%d y=%d\n", x, y); } | cs |
이 방법은 잘못된 방법입니다. 값에 의한 호출을하게되면 복사본이 전달되기때문에 swap함수 내부에서만 바뀌게됩니다. 그렇기때문에 main()함수의 값은 바뀌지 않게됩니다.
swap함수의 x,y와 main함수의 a,b는 완전이 다른 함수라는 것 입니다. 이는 함수의 매개 변수는 기본적으로 값에 의한 호출이기때문에 복사본이 전달됩니다. 같은 이름으로 해도 복사본이 전달되게 됩니다. 이를 해결하기 위한것이 참조에 의한 호출 입니다.
참조에 의한 호출
변수의 복사본이 아닌 원본이 직접 전달 되는 것이다. C언어에서는 포인터를 통하여 main함수의 a,b의 주소를 통하여 직접적으로 접근이 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> void swap(int *px, int *py); int main() { int a = 100, b = 200; printf("a=%d b=%d\n", a, b); swap(&a, &b); printf("a=%d b=%d\n", a, b); return 0; } void swap(int *px, int *py) // sawp(&a, &b)의 변수의 주소가 직접 전달된다. { int tmp; tmp = *px; *px = *py; *py = tmp; } | cs |
위와같이 포인터를 통하여 매개변수를 정해주고 인수로 &a, &b로 해주게되면 변수의 주소가 직접 전달되기때문에 swap함수에서 값을 변경하면 주소에 직접 접근해서 값을 바꿀수 있게됩니다.
포인터 사용의 장점
1. 참조에 의한 호출
- 외부의 변수나 배열에 직접 접근하여서 값을 변경 할 수 있다.
2. 동적 메모리 할당
- 동적 메모리 할당이 가능하게되어 메모리를 실시간으로 할당받을 수 있는 중요한 기법이 가능하다.