Data Structure 1 - pointer
포인터 변수는 메모리에 저장된 값의 주소를 저장하는 변수이다. 따라서 어떤 값을 전달하거나 참조할 때 유용하게 사용할 수 있다.
아래 코드는 포인터를 받아 두 변수의 값을 바꾸는(swap) 함수이다.
어떤 변수의 값을 함수에 매개변수로 바로 전달하여 값을 변환하려고 하면, 해당 과정이 함수 내부의 지역 변수에 의해 이루어져 값이 바뀌지 않을 때가 있다. 따라서 이런 경우에는 포인터를 이용해 변환하는 것이 효율적이다.
#include<stdio.h>
#include<stdlib.h> // 동적메모리 할당하는 malloc, free 함수가 포함됨.
void pswap(int** p1, int** p2)
{
int *temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void dswap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void swap(int* p1, int* p2) {
int *temp = p1;
p1 = p2;
p2 = temp;
}
int main()
{
int* ptr;
int k = 21;
ptr = &k;
printf("%d\n", ptr); // 포인터를 그대로 쓰면 그 주소값 반환.
printf("%d\n", *ptr); // 포인터 앞에 다시 간접참조연산자를 붙이면 그 주소 값에 저장된 값을 반환
*ptr = 22;
printf("%d\n", *ptr); // 간접참조연산자를 통해 값을 변경가능
int str[3] = { 1,2,3 };
printf("%d %d %d\n", str, &str[0], str[0]); // 배열의 이름 = 배열 첫원소의 메모리 주소. 배열이름은 가르키는 포인터 주소를 변경 불가능한 포인터 상수.
int a = 10, b = 20;
int* pa = &a;
int* pb = &b;
printf("함수호출전 %d %d \n", *pa, *pb);
swap(pa, pb);
printf("swap 함수호출후 % d % d\n", a, b); // 함수 내부에서 값의 복사만 발생했으므로 값이 바뀌지 않음.
printf("swap 함수호출후 %d %d\n", *pa, *pb); // 주솟값을 p1,p2에 복사하였지만 지역변수이므로 pa, pb의 값은 바뀌지 않음.
dswap(pa, pb);
printf("포인터 함수호출후 %d %d\n", a, b); // 주솟값을 받아 swap 하였으므로 a,b 변수의 값이 바뀐 상태이다.
printf("포인터 함수호출후 %d %d\n", *pa, *pb); // 주솟값이 가리키는 변수를 직접 가리키므로 pa, pb의 값이 바뀜.
int* paa = &pa;
int* pbb = &pb;
pswap(paa, pbb);
printf("더블포인터 함수호출후 포인터가 가리키는 값 %d %d \n", *pa, *pb); // 앞서 포인터로 받아서 변수의 값을 변화시킨 것과 다르게 이번에는 변수의 포인터 값을 바꿈으로써 각 포인터변수가 가르키는 것을 바꾼것.
printf("더블포인터 함수호출후 변수에 저장된 값 %d %d\n", a, b); // 따라서 앞서와 달리 각 변수를 출력해보면 변화하지 않았다는 것을 확인할 수 있다.
return 0;
}
댓글
댓글 쓰기