포인터를 사용한 숫자 교환

CBeginner
지금 연습하기

소개

C 프로그래밍에서 포인터는 메모리 위치에 직접 접근하고 수정하여 데이터를 조작할 수 있는 강력한 기능입니다. 포인터의 일반적인 응용 분야 중 하나는 세 번째 변수를 사용하지 않고 두 변수 간의 값을 교환하는 것입니다.

이 랩에서는 포인터를 사용하여 두 숫자를 교환하는 C 프로그램을 만드는 방법을 배웁니다. 이 기술은 다양한 프로그래밍 시나리오에서 기본이며 메모리 조작을 위한 포인터의 실용적인 사용법을 보여줍니다.

이 랩에서는 프로그램을 처음부터 만들고, 컴파일하고, 실행하여 교환이 실제로 이루어지는 것을 확인할 수 있도록 안내합니다.

C 언어의 포인터 이해

코딩을 시작하기 전에, 포인터가 무엇이며 C 언어에서 어떻게 작동하는지 이해해 봅시다.

포인터란 무엇인가?

포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터는 C 언어에서 메모리에 직접 접근하고 데이터를 보다 효율적으로 조작할 수 있게 해주기 때문에 필수적입니다.

포인터 구문

C 언어에서 포인터는 별표 (*) 기호를 사용하여 선언됩니다.

int *ptr;    // 정수에 대한 포인터를 선언합니다.

포인터를 사용할 때 두 가지 중요한 연산자를 사용합니다.

  • 주소 연산자 (&) - 변수의 메모리 주소를 가져옵니다.
  • 역참조 연산자 (*) - 포인터가 가지고 있는 주소에 저장된 값에 접근합니다.

첫 번째 파일 만들기

프로젝트 디렉토리에 메인 C 파일을 만들어 보겠습니다. IDE 를 열고 main.c라는 새 파일을 만듭니다.

  1. 파일 탐색기 패널 (왼쪽) 에서 /home/labex/project로 이동합니다.
  2. 마우스 오른쪽 버튼을 클릭하고 "새 파일"을 선택합니다.
  3. 파일 이름을 main.c로 지정합니다.
  4. 파일에 다음 기본 구조를 추가합니다.
#include <stdio.h>

int main() {
    // 여기에 코드를 추가합니다.

    return 0;
}

이렇게 하면 표준 입출력 라이브러리가 포함되고 프로그램이 성공적으로 완료되면 0 을 반환하는 main 함수가 있는 간단한 C 프로그램이 생성됩니다.

교환 프로그램 구조 생성

이제 포인터를 이해했으니, 교환 프로그램을 단계별로 구축해 보겠습니다.

변수 및 포인터 선언

다음과 같이 선언해야 합니다.

  1. 교환하려는 값을 저장할 두 개의 정수 변수 (ab)
  2. ab의 주소를 저장할 두 개의 정수 포인터 (ptraptrb)
  3. 교환 연산을 돕기 위한 임시 변수 (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;
}

코드 이해

지금까지 한 일을 분석해 보겠습니다.

  1. 교환하려는 값을 저장할 두 개의 정수 ab를 선언했습니다.
  2. ab의 메모리 주소를 저장할 두 개의 정수 포인터 ptraptrb를 선언했습니다.
  3. 교환 연산을 돕기 위한 임시 정수 temp를 선언했습니다.
  4. 사용자에게 ab의 값을 입력하라는 메시지를 표시하는 코드를 추가했습니다.
  5. ab의 원래 값을 표시하는 코드를 추가했습니다.

scanf 함수에서 입력 값을 메모리에 저장할 위치를 함수에 알려주기 위해 주소 연산자 (&) 를 사용한다는 점에 유의하십시오.

교환 로직 구현

이제 포인터를 사용하여 실제 교환 로직을 구현해 보겠습니다.

포인터에 주소 할당

먼저, ab의 주소를 각각 ptraptrb에 할당하여 포인터가 변수를 가리키도록 해야 합니다.

// 포인터에 주소 할당
ptra = &a;
ptrb = &b;

포인터를 사용한 교환 알고리즘

포인터를 사용하여 값을 교환하는 핵심은 포인터 자체뿐만 아니라 메모리 위치의 값을 조작하는 것입니다. 방법은 다음과 같습니다.

  1. a의 값 (*ptra를 통해 접근) 을 임시 변수 temp에 저장합니다.
  2. b의 값 (*ptrb를 통해 접근) 을 a에 할당합니다 ( *ptra 사용).
  3. 임시 값 (원래 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;
}

교환 로직 이해

교환이 정확히 어떻게 작동하는지 이해해 보겠습니다.

  1. temp = *ptra; - * 연산자는 포인터를 역참조하여 메모리 위치의 값에 접근합니다. 이 줄은 a의 값을 temp에 저장합니다.
  2. *ptra = *ptrb; - 이것은 b의 값을 a의 메모리 위치에 할당하여 효과적으로 a의 값을 변경합니다.
  3. *ptrb = temp; - 이것은 a의 원래 값 ( temp에 저장됨) 을 b의 메모리 위치에 할당하여 교환을 완료합니다.

이러한 연산 후, 변수 ab는 직접 수정하지 않고 값을 교환했습니다. - 우리는 단지 메모리 위치의 값만 수정했습니다.

교환 프로그램 컴파일 및 테스트

이제 프로그램을 완성했으니, 컴파일하고 실행하여 결과를 확인해 보겠습니다.

프로그램 컴파일

프로그램을 컴파일하기 위해 GNU C 컴파일러 (gcc) 를 사용합니다. WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

cd ~/project
gcc main.c -o swap_program

이 명령은 main.c 파일을 컴파일하고 swap_program이라는 실행 파일을 생성합니다.

프로그램 실행

이제 프로그램이 값을 올바르게 교환하는지 확인하기 위해 실행해 보겠습니다.

./swap_program

ab의 값을 입력하라는 메시지가 표시됩니다. 예를 들어, 다음을 입력해 보겠습니다.

  • a = 5
  • b = 10

프로그램은 다음을 표시해야 합니다.

  • 원래 값: a = 5, b = 10
  • a 와 b 의 메모리 주소
  • 교환된 값: a = 10, b = 5

출력 이해

프로그램을 실행하면 여러 섹션의 출력을 볼 수 있습니다.

  1. 원래 값 - 교환 전의 값을 표시합니다.
  2. 메모리 주소 - 변수가 메모리에 저장되는 위치를 표시합니다 (프로그램을 실행할 때마다 다름).
  3. 교환 후 - 교환 연산 후의 값을 표시합니다.

교환이 일관되게 작동하는지 확인하기 위해 다른 입력 값으로 프로그램을 여러 번 실행해 보십시오.

어떻게 작동할까요?

메모리에서 어떤 일이 발생하는지 시각화해 보겠습니다.

  1. 처음에 a = 5이고 b = 10이면 각자 고유한 메모리 위치를 갖습니다.
  2. ptraa의 메모리 위치를 가리킵니다.
  3. ptrbb의 메모리 위치를 가리킵니다.
  4. 교환 중:
    • tempptra의 값 (5) 을 얻습니다.
    • ptra의 값은 ptrb의 값 (10) 으로 변경됩니다.
    • ptrb의 값은 temp(5) 로 변경됩니다.
  5. 교환 후, a = 10이고 b = 5가 되어 효과적으로 값을 교환합니다.

이것은 포인터의 강력함을 보여줍니다. - 포인터는 메모리 위치를 직접 조작하여 값을 간접적으로 수정할 수 있게 해줍니다.

요약

이 랩에서는 C 에서 포인터를 사용하여 두 변수의 값을 교환하는 방법을 배웠습니다. 다룬 주요 개념은 다음과 같습니다.

  1. 포인터 (Pointers): 다른 변수의 메모리 주소를 저장하는 변수
  2. 메모리 주소 (Memory Addresses): 데이터가 저장되는 컴퓨터 메모리의 고유한 위치
  3. 포인터 연산 (Pointer Operations):
    • 변수의 메모리 주소를 얻는 주소 연산자 (&)
    • 메모리 주소의 값에 접근하는 역참조 연산자 (*)
  4. 교환 알고리즘 (Swap Algorithm): 임시 변수와 포인터를 사용하여 값을 교환

이 기술은 C 프로그래밍의 기본 개념이며 메모리 조작을 위한 포인터의 강력함을 보여줍니다. 정렬 알고리즘, 데이터 구조 연산 및 함수 구현과 같은 다양한 프로그래밍 시나리오에 적용할 수 있습니다.

메모리 주소를 통해 데이터를 조작하는 방법을 이해함으로써 C 프로그래밍 및 컴퓨터 메모리 개념을 마스터하는 데 중요한 단계를 밟았습니다.