변수를 사용하는 가장 쉬운 방법은 이름을 쓰는 겁니다. 포인터를 사용하려면 추가적인 변수 선언이 필요하고 주소 연산, 간접 참조 연산 등 각종 연산을 수행해야 합니다. 그러니 포인터를 일부러 즐겨 사용할 필요는 없습니다. 그러나 임베디드 프로그래밍을 할 때 메모리에 직접 접근하는 경우나 동적 할당한 메모리를 사용하는 경우에는 포인터가 반드시 필요합니다.
// 포인터를 사용한 두 변수의 값 교환
#include <stdio.h>
void swap(int *pa, int *pb); // 두 변수의 값을 바꾸는 함수의 선언
int main(void)
{
int a = 10, b = 20; // 변수 선언과 초기화
swap(&a, &b); // a, b의 주소를 인수로 주고 함수 호출
printf("a:%d, b:%d\n", a, b); // 변수 a, b 출력
return 0;
}
void swap(int *pa, int *pb) // 매개변수로 포인터 선언
{
int temp; // 교환을 위한 임시 변수
temp = *pa; // temp에 pa가 가리키는 변수의 값 저장
*pa = *pb; // pa가 가리키는 변수에 pb가 가리키는 변수의 값 저장
*pb = temp; // pb가 가리키는 변수에 temp 값 저장
}
교환 작업은 swap 함수 안에서 포인터를 통해 진행되지만 실제로 바뀌는 값은 main 함수의 변수 a와 b가 됩니다. 결국 swap 함수는 포인터를 통해 main 함수의 변수 a, b를 공유하므로 두 변수를 직접 바꾸는 일이 가능해집니다. 이제 두 변수의 값을 바꾸고싶을 때는 언제든지 swap 함수를 호출하면 됩니다.
// 다른 함수의 변수 사용하기
#include <stdio.h>
void swap(void);
int main(void)
{
int a = 10, b = 20; // 변수 선언과 초기화
swap(); // 인수 없이 함수 호출
printf("a:%d, b:%d\n", a, b); // 변수 a, b 출력
return 0;
}
void swap(void) // 인수가 없으므로 매개변수도 없음
{
int temp; // 교환을 위한 변수
temp = a; // temp에 main 함수의 a 값 저장
a = b; // main 함수의 a에 main 함수의 b 값 저장
b = temp; // main 함수의 b에 temp 값 저장
}
함수 안에 선언된 변수명은 사용 범위가 함수 내부로 제한되므로 main 함수에 있는 변수 a, b는 다른 함수인 swap 함수에서 그 이름을 사용할 수 없습니다. 좀 더 정확한 설명은ㅇ변수가 선언된 시점부터 선언된 블록 끝까지로 제한됩니다. 결국 이 방법은 컴파일 단계에서 문제가 발생합니다. 다음 방법은 main 함수에서 a, b의 값을 swap 함수에 인수로 주는 방법입니다.
#include <stdio.h>
void swap(int x, int y); // 두 변수의 값을 바꾸는 함수 선언
int main(void)
{
int a = 10, b = 20; // 변수 선언과 초기화
swap(a, b); // a, b의 값을 복사해서 전달
printf("a:%d, b:%d\n", a, b); // 변수 a, b 출력
return 0;
}
void swap(int x, int y) // 인수 a, b의 값을 x, y에 복사해서 저장
{
int temp; // 교환을 위한 변수
temp = x; // temp에 x 값 저장
x = y // x에 y 값 저장
y = temp; // y에 temp 값 저장
}
결국 swap 함수 안에서는 a, b의 복사복을 바꾸므로 main 함수의 두 변수 a, b의 값은 변함이 없게 됩니다. swap 함수에서 매개변수의 이름을 a, b로 사용해도 결과는 같습니다. 이름이 같아도 함수가 다르면 메모리에 별도의 저장 공간을 확보하므로 전형 다른 변수로 사용됩니다.
'프로그래밍언어 > C 언어' 카테고리의 다른 글
[C 언어] 배열명으로 배열 요소 사용하기 (0) | 2022.12.08 |
---|---|
[C 언어] 배열과 포인터의 관계 (0) | 2022.12.08 |
[C 언어] 포인터의 대입 규칙 (0) | 2022.12.07 |
[C 언어] 주소와 포인터의 크기 (0) | 2022.12.07 |
[C 언어] 주소와 포인터의 차이 (0) | 2022.12.07 |