소개
C 프로그래밍에서 포인터는 메모리 위치에 직접 접근하고 수정하여 데이터를 조작할 수 있는 강력한 기능입니다. 포인터의 일반적인 응용 분야 중 하나는 세 번째 변수를 사용하지 않고 두 변수 간의 값을 교환하는 것입니다.
이 랩에서는 포인터를 사용하여 두 숫자를 교환하는 C 프로그램을 만드는 방법을 배웁니다. 이 기술은 다양한 프로그래밍 시나리오에서 기본이며 메모리 조작을 위한 포인터의 실용적인 사용법을 보여줍니다.
이 랩에서는 프로그램을 처음부터 만들고, 컴파일하고, 실행하여 교환이 실제로 이루어지는 것을 확인할 수 있도록 안내합니다.
C 언어의 포인터 이해
코딩을 시작하기 전에, 포인터가 무엇이며 C 언어에서 어떻게 작동하는지 이해해 봅시다.
포인터란 무엇인가?
포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터는 C 언어에서 메모리에 직접 접근하고 데이터를 보다 효율적으로 조작할 수 있게 해주기 때문에 필수적입니다.
포인터 구문
C 언어에서 포인터는 별표 (*) 기호를 사용하여 선언됩니다.
int *ptr; // 정수에 대한 포인터를 선언합니다.
포인터를 사용할 때 두 가지 중요한 연산자를 사용합니다.
- 주소 연산자 (
&) - 변수의 메모리 주소를 가져옵니다. - 역참조 연산자 (
*) - 포인터가 가지고 있는 주소에 저장된 값에 접근합니다.
첫 번째 파일 만들기
프로젝트 디렉토리에 메인 C 파일을 만들어 보겠습니다. IDE 를 열고 main.c라는 새 파일을 만듭니다.
- 파일 탐색기 패널 (왼쪽) 에서
/home/labex/project로 이동합니다. - 마우스 오른쪽 버튼을 클릭하고 "새 파일"을 선택합니다.
- 파일 이름을
main.c로 지정합니다. - 파일에 다음 기본 구조를 추가합니다.
#include <stdio.h>
int main() {
// 여기에 코드를 추가합니다.
return 0;
}
이렇게 하면 표준 입출력 라이브러리가 포함되고 프로그램이 성공적으로 완료되면 0 을 반환하는 main 함수가 있는 간단한 C 프로그램이 생성됩니다.
교환 프로그램 구조 생성
이제 포인터를 이해했으니, 교환 프로그램을 단계별로 구축해 보겠습니다.
변수 및 포인터 선언
다음과 같이 선언해야 합니다.
- 교환하려는 값을 저장할 두 개의 정수 변수 (
a및b) a와b의 주소를 저장할 두 개의 정수 포인터 (ptra및ptrb)- 교환 연산을 돕기 위한 임시 변수 (
temp)
main.c 파일을 다음 코드로 업데이트하십시오.
#include <stdio.h>
int main() {
// 변수 선언
int a, b;
int *ptra, *ptrb;
int temp;
// 사용자로부터 입력 받기
printf("a 의 값을 입력하세요: ");
scanf("%d", &a);
printf("b 의 값을 입력하세요: ");
scanf("%d", &b);
// 원래 값 표시
printf("\n원래 값:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
// 다음 단계에서 여기에 더 많은 코드를 추가합니다.
return 0;
}
코드 이해
지금까지 한 일을 분석해 보겠습니다.
- 교환하려는 값을 저장할 두 개의 정수
a와b를 선언했습니다. a와b의 메모리 주소를 저장할 두 개의 정수 포인터ptra와ptrb를 선언했습니다.- 교환 연산을 돕기 위한 임시 정수
temp를 선언했습니다. - 사용자에게
a와b의 값을 입력하라는 메시지를 표시하는 코드를 추가했습니다. a와b의 원래 값을 표시하는 코드를 추가했습니다.
scanf 함수에서 입력 값을 메모리에 저장할 위치를 함수에 알려주기 위해 주소 연산자 (&) 를 사용한다는 점에 유의하십시오.
교환 로직 구현
이제 포인터를 사용하여 실제 교환 로직을 구현해 보겠습니다.
포인터에 주소 할당
먼저, a와 b의 주소를 각각 ptra와 ptrb에 할당하여 포인터가 변수를 가리키도록 해야 합니다.
// 포인터에 주소 할당
ptra = &a;
ptrb = &b;
포인터를 사용한 교환 알고리즘
포인터를 사용하여 값을 교환하는 핵심은 포인터 자체뿐만 아니라 메모리 위치의 값을 조작하는 것입니다. 방법은 다음과 같습니다.
a의 값 (*ptra를 통해 접근) 을 임시 변수temp에 저장합니다.b의 값 (*ptrb를 통해 접근) 을a에 할당합니다 (*ptra사용).- 임시 값 (원래
a의 값) 을b에 할당합니다 (*ptrb사용).
이전 단계에서 표시된 위치에 다음 코드를 추가하여 main.c 파일을 업데이트하십시오.
#include <stdio.h>
int main() {
// 변수 선언
int a, b;
int *ptra, *ptrb;
int temp;
// 사용자로부터 입력 받기
printf("a 의 값을 입력하세요: ");
scanf("%d", &a);
printf("b 의 값을 입력하세요: ");
scanf("%d", &b);
// 원래 값 표시
printf("\n원래 값:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
// 포인터에 주소 할당
ptra = &a;
ptrb = &b;
// 메모리 주소 표시 (선택 사항이지만 이해에 도움이 됨)
printf("\n메모리 주소:\n");
printf("a 의 주소: %p\n", ptra);
printf("b 의 주소: %p\n", ptrb);
// 포인터를 사용하여 값 교환
temp = *ptra; // a 의 값을 temp 에 저장
*ptra = *ptrb; // b 의 값을 a 에 할당
*ptrb = temp; // a 의 원래 값을 b 에 할당
// 교환 후 값 표시
printf("\n교환 후:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
교환 로직 이해
교환이 정확히 어떻게 작동하는지 이해해 보겠습니다.
temp = *ptra;-*연산자는 포인터를 역참조하여 메모리 위치의 값에 접근합니다. 이 줄은a의 값을temp에 저장합니다.*ptra = *ptrb;- 이것은b의 값을a의 메모리 위치에 할당하여 효과적으로a의 값을 변경합니다.*ptrb = temp;- 이것은a의 원래 값 (temp에 저장됨) 을b의 메모리 위치에 할당하여 교환을 완료합니다.
이러한 연산 후, 변수 a와 b는 직접 수정하지 않고 값을 교환했습니다. - 우리는 단지 메모리 위치의 값만 수정했습니다.
교환 프로그램 컴파일 및 테스트
이제 프로그램을 완성했으니, 컴파일하고 실행하여 결과를 확인해 보겠습니다.
프로그램 컴파일
프로그램을 컴파일하기 위해 GNU C 컴파일러 (gcc) 를 사용합니다. WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.
cd ~/project
gcc main.c -o swap_program
이 명령은 main.c 파일을 컴파일하고 swap_program이라는 실행 파일을 생성합니다.
프로그램 실행
이제 프로그램이 값을 올바르게 교환하는지 확인하기 위해 실행해 보겠습니다.
./swap_program
a와 b의 값을 입력하라는 메시지가 표시됩니다. 예를 들어, 다음을 입력해 보겠습니다.
a= 5b= 10
프로그램은 다음을 표시해야 합니다.
- 원래 값: a = 5, b = 10
- a 와 b 의 메모리 주소
- 교환된 값: a = 10, b = 5
출력 이해
프로그램을 실행하면 여러 섹션의 출력을 볼 수 있습니다.
- 원래 값 - 교환 전의 값을 표시합니다.
- 메모리 주소 - 변수가 메모리에 저장되는 위치를 표시합니다 (프로그램을 실행할 때마다 다름).
- 교환 후 - 교환 연산 후의 값을 표시합니다.
교환이 일관되게 작동하는지 확인하기 위해 다른 입력 값으로 프로그램을 여러 번 실행해 보십시오.
어떻게 작동할까요?
메모리에서 어떤 일이 발생하는지 시각화해 보겠습니다.
- 처음에
a = 5이고b = 10이면 각자 고유한 메모리 위치를 갖습니다. ptra는a의 메모리 위치를 가리킵니다.ptrb는b의 메모리 위치를 가리킵니다.- 교환 중:
temp는ptra의 값 (5) 을 얻습니다.ptra의 값은ptrb의 값 (10) 으로 변경됩니다.ptrb의 값은temp(5) 로 변경됩니다.
- 교환 후,
a = 10이고b = 5가 되어 효과적으로 값을 교환합니다.
이것은 포인터의 강력함을 보여줍니다. - 포인터는 메모리 위치를 직접 조작하여 값을 간접적으로 수정할 수 있게 해줍니다.
요약
이 랩에서는 C 에서 포인터를 사용하여 두 변수의 값을 교환하는 방법을 배웠습니다. 다룬 주요 개념은 다음과 같습니다.
- 포인터 (Pointers): 다른 변수의 메모리 주소를 저장하는 변수
- 메모리 주소 (Memory Addresses): 데이터가 저장되는 컴퓨터 메모리의 고유한 위치
- 포인터 연산 (Pointer Operations):
- 변수의 메모리 주소를 얻는 주소 연산자 (
&) - 메모리 주소의 값에 접근하는 역참조 연산자 (
*)
- 변수의 메모리 주소를 얻는 주소 연산자 (
- 교환 알고리즘 (Swap Algorithm): 임시 변수와 포인터를 사용하여 값을 교환
이 기술은 C 프로그래밍의 기본 개념이며 메모리 조작을 위한 포인터의 강력함을 보여줍니다. 정렬 알고리즘, 데이터 구조 연산 및 함수 구현과 같은 다양한 프로그래밍 시나리오에 적용할 수 있습니다.
메모리 주소를 통해 데이터를 조작하는 방법을 이해함으로써 C 프로그래밍 및 컴퓨터 메모리 개념을 마스터하는 데 중요한 단계를 밟았습니다.



