c언어 포인터를 이용한 스왑함수, 전역 변수를 이용한 스왑함수.
@ 포인터 변수
int a=5; //일반적인 변수
/*----------------------------*/
int *p;
char *p;
밑에 두 개 변수의 형태를 포인터 변수라고 합니다.
각각, 인트형 주소와 캐릭터형 주소를 저장할 수 있는 포인터 변수입니다.
포인터 변수에는 어떤 값이 아니 주소가 담기게 되는데 주소를 담기 위해서 &(주소연산자를) 변수명 앞에 붙여주게 됩니다.
*p=&a;
#include <stdio.h> int main() { int *p; //포인터 변수 p int a=5; //일반 변수 a p=&a;
printf("변수 a의 값 : %d\n",a); printf("변수 a의 주소 : %d\n",&a);
printf("포인터 변수 p의 값 : %d\n",p); printf("포인터 변수 p의 주소 : %d\n",&p); printf("포인터 변수 p가 가리키는 변수의 값 : %d\n",*p); } |
|
변수 a의 주소 == 포인터 변수 p의 값 변수 a의 값 == 포인터 변수 p가 가리키는 변수의 값 |
@ 왜 필요한가?
함수의 리턴값(반환값)이 두 개 이상이라면, 일반적인 방법으로는 불가능 하지만 포인터를 이용하면 가능하다.
@ 스왑 구현
- 메인 함수 내에서 처리할 때.
#include <stdio.h> int main() { int a=5; int b=10; int temp;
printf("값 교환 전 a: %d b: %d\n",a,b);
temp=a; a=b; b=temp;
printf("값 교환 후 a: %d b: %d\n",a,b);
} |
이런 식으로 가능하지만, 만약에 스왑 구문이 여기저기 자주 쓰인다면 함수로 작성하는 것이 보기도 좋고 코딩하기도 편할 것입니다. |
- 함수 구현
#include <stdio.h> void swap(int a, int b); int main() { int a=5; int b=10;
printf("값 교환 전 a: %d b: %d\n",a,b);
swap(&a,&b);
printf("값 교환 후 a: %d b: %d\n",a,b);
}
void swap(int *a, int *b) { int temp;
temp=*a; *a=*b; *b=temp;
} |
|
교환 전 과 교환 후의 값이 정상적으로 교환 되었습니다.
메인 함수에서 swap(&a, &b); 호출 a와 b 변수의 주소를 넘겨 주었습니다.
swap함수에서는 포인터 변수 int *a와 int *b로 그 주소들을 받고 스왑구문을 통해 각각 포인터 변수들이 가리키는 값들을 교환 합니다.
|
- 함수 구현(전역변수 이용)
#include <stdio.h> void swap(); int a,b;
int main() { a=5; b=10;
printf("값 교환 전 a: %d b: %d\n",a,b);
swap();
printf("값 교환 후 a: %d b: %d\n",a,b);
}
void swap() { int temp;
temp=a; a=b; b=temp;
} |
|
언뜻 포인터 사용한 것 보다 간단해 보이지만.. 두 가지 방법의 장.단 점이 있으니. 판단은 프로그래머의 몫? |
- 함수 구현(포인터 없이)
#include <stdio.h> void swap(int a, int b); int main() { int a=5; int b=10;
printf("값 교환 전 a: %d b: %d\n",a,b);
swap(a,b);
printf("값 교환 후 a: %d b: %d\n",a,b);
}
void swap(int a, int b) { int temp;
temp=a; a=b; b=temp;
} |
|
교환 전 후 값이 그대로 입니다. 스왑 함수 내부에서 값 교환은 이루어지나 그 값들은 다시 메인함수로 리턴(반환) 하지 못하기 때문입니다. |
'IT > Programing' 카테고리의 다른 글
c언어 2차원 배열 (0) | 2013.12.21 |
---|---|
c언어 삽입정렬 (0) | 2013.12.13 |
c언어 선택정렬 (0) | 2013.12.12 |