IT프로그램 언어/C 언어

C언어 기초(포인터: 초보자를 위한 가이드)

필립곽 2024. 11. 11. 21:16
반응형

C언어는 프로그래밍 언어 중에서 메모리 관리와 저수준 작업을 수행하는 데 매우 강력한 기능을 제공합니다. 그중에서도 포인터는 C언어의 핵심 개념 중 하나입니다. 포인터는 메모리 주소를 저장하는 변수로, 메모리를 효율적으로 관리하고 데이터 구조를 다루는 데 유용합니다. 이번 글에서는 C언어의 포인터에 대해 다양한 예제를 통해 알아보겠습니다.

1.포인터란 무엇인가?


포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 사용하면 직접 메모리 주소를 참조하고 조작할 수 있으며, 이는 프로그램의 성능과 유연성을 높이는 데 큰 도움이 됩니다.

포인터의 기본 구문
포인터를 선언할 때는 변수의 데이터 타입 앞에 * 기호를 사용합니다. 예를 들어, 정수형 포인터는 다음과 같이 선언합니다:

[예제]
int *ptr;
여기서 ptr은 정수형 값을 가리키는 포인터입니다.

포인터 예제 1: 기본적인 포인터 사용
아래 예제는 포인터를 사용하여 변수의 값을 변경하는 방법을 보여줍니다.

#include <stdio.h>

int main() {
    int num = 10;      // 정수형 변수 선언
    int *ptr = &num;  // num의 주소를 ptr에 저장

    printf("num의 값: %d\n", num);
    printf("ptr이 가리키는 값: %d\n", *ptr); // ptr이 가리키는 값 출력

    *ptr = 20; // ptr을 통해 num의 값 변경

    printf("num의 새 값: %d\n", num); // 변경된 값 출력

    return 0;
}

[코드 설명]
num이라는 정수형 변수를 선언하고 10으로 초기화합니다.
ptr이라는 정수형 포인터를 선언하고 num의 주소를 저장합니다.
printf를 사용하여 num의 값과 ptr이 가리키는 값을 출력합니다.
*ptr을 통해 num의 값을 20으로 변경합니다.
포인터 예제 2: 포인터와 배열
포인터는 배열과도 밀접한 관계가 있습니다. 배열의 이름은 배열의 첫 번째 요소의 주소를 가리키므로, 포인터를 사용하여 배열의 요소에 접근할 수 있습니다.

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50}; // 정수형 배열
    int *ptr = arr; // 배열의 첫 번째 요소의 주소를 ptr에 저장

    printf("배열의 요소:\n");
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, *(ptr + i)); // 포인터를 사용하여 배열 요소 출력
    }

    return 0;
}

[코드 설명]
arr이라는 정수형 배열을 선언하고 초기화합니다.
ptr 포인터를 배열 arr의 첫 번째 요소의 주소로 초기화합니다.
for 루프를 사용하여 포인터를 통해 배열의 요소를 출력합니다.
포인터 예제 3: 함수와 포인터
포인터는 함수에서 인자를 전달할 때 매우 유용합니다. 포인터를 사용하면 함수 내에서 변수의 값을 직접 수정할 수 있습니다.
 
[예제]
#include <stdio.h>

// 두 숫자의 값을 교환하는 함수
void swap(int *a, int *b) {
    int temp = *a; // a가 가리키는 값 저장
    *a = *b;       // b의 값을 a에 저장
    *b = temp;    // temp 값을 b에 저장
}

int main() {
    int x = 5, y = 10;

    printf("교환 전: x = %d, y = %d\n", x, y);
    swap(&x, &y); // x와 y의 주소를 전달
    printf("교환 후: x = %d, y = %d\n", x, y);

    return 0;
}

[코드 설명]
swap 함수는 두 개의 정수형 포인터를 매개변수로 받아 해당 주소의 값을 교환합니다.
main 함수에서 두 정수 x와 y를 선언하고, swap 함수를 호출할 때 각각의 주소를 전달합니다.
함수 호출 후, 두 변수의 값이 교환된 것을 확인할 수 있습니다.


2.포인터의 장점


포인터를 사용하는 장점은 다음과 같습니다:

메모리 효율성: 큰 데이터를 함수에 전달할 때, 포인터를 사용하면 데이터 복사가 필요 없으므로 메모리를 절약할 수 있습니다.
유연한 데이터 구조: 링크드 리스트, 트리 등 동적 데이터 구조를 구현하는 데 필수적입니다.
직접 메모리 접근: 메모리 주소를 직접 조작할 수 있어 저수준 프로그래밍이 가능합니다.


3.결론


C언어의 포인터는 프로그램의 성능을 극대화하고, 복잡한 데이터 구조를 다루는 데 필수적인 요소입니다. 이번 글을 통해 포인터의 기본 개념과 다양한 예제를 살펴보았습니다. 포인터를 잘 이해하고 활용하면 C언어 프로그래밍의 깊이를 더할 수 있을 것입니다. 앞으로의 학습에서도 포인터 개념을 활용해 보세요.
 
 

반응형