c 언어

C 이중 포인터와 함수 포인터, 포인터 배열과 배열 포인터

임베디드 친구 2024. 12. 14. 11:18
반응형

포인터는 C 언어에서 매우 중요한 개념으로, 메모리 관리와 효율적인 데이터 처리를 가능하게 합니다. 이번 포스팅에서는 이중 포인터, 함수 포인터, 포인터 배열, 그리고 배열 포인터에 대해 설명하고, 각 주제별로 예제를 제공하겠습니다.


1. 이중 포인터 (Double Pointer)

이중 포인터란?

이중 포인터는 포인터를 가리키는 포인터입니다. 쉽게 말해, 포인터의 주소를 저장하는 포인터입니다. 이중 포인터는 다음과 같은 경우에 유용합니다:

  • 다차원 배열을 처리할 때
  • 동적 메모리 할당에서 다차원 구조를 구현할 때
  • 함수에서 포인터 값을 수정하고자 할 때

문법

int **pp;

위 코드에서 pp는 이중 포인터로, 포인터 변수의 주소를 저장할 수 있습니다.

예제: 이중 포인터를 활용한 값 변경

#include <stdio.h>

void changeValue(int **ptr) {
    **ptr = 20; // 이중 포인터를 사용하여 값을 변경
}

int main() {
    int value = 10;
    int *p = &value;
    int **pp = &p;

    printf("Before: %d\n", value);
    changeValue(pp);
    printf("After: %d\n", value);

    return 0;
}

실행 결과

Before: 10
After: 20

2. 함수 포인터 (Function Pointer)

함수 포인터란?

함수 포인터는 함수의 주소를 저장하는 포인터입니다. 함수 포인터를 사용하면 함수를 매개변수로 전달하거나 동적으로 함수 호출을 결정할 수 있습니다.

문법

return_type (*function_pointer_name)(parameter_types);

예제: 함수 포인터를 사용한 함수 호출

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

void operate(int a, int b, int (*operation)(int, int)) {
    printf("Result: %d\n", operation(a, b));
}

int main() {
    int (*func_ptr)(int, int); // 함수 포인터 선언

    func_ptr = add;
    operate(10, 5, func_ptr);

    func_ptr = subtract;
    operate(10, 5, func_ptr);

    return 0;
}

실행 결과

Result: 15
Result: 5

3. 포인터 배열 (Array of Pointers)

포인터 배열이란?

포인터 배열은 여러 개의 포인터를 배열 형태로 저장하는 것입니다. 문자열 배열이나 여러 메모리 블록을 다룰 때 유용합니다.

문법

data_type *array_name[array_size];

예제: 문자열 배열

#include <stdio.h>

int main() {
    const char *colors[] = {"Red", "Green", "Blue", "Yellow"};

    for (int i = 0; i < 4; i++) {
        printf("Color[%d]: %s\n", i, colors[i]);
    }

    return 0;
}

실행 결과

Color[0]: Red
Color[1]: Green
Color[2]: Blue
Color[3]: Yellow

4. 배열 포인터 (Pointer to an Array)

배열 포인터란?

배열 포인터는 배열 전체를 가리키는 포인터입니다. 이 개념은 다차원 배열을 다룰 때 특히 유용합니다.

문법

data_type (*pointer_name)[array_size];

예제: 배열 포인터와 다차원 배열

#include <stdio.h>

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    int (*p)[3] = matrix; // 배열 포인터 선언

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }

    return 0;
}

실행 결과

1 2 3
4 5 6

요약

이번 포스팅에서는 C 언어의 이중 포인터, 함수 포인터, 포인터 배열, 그리고 배열 포인터를 다루었습니다. 각 개념에 대한 정의와 함께 예제를 통해 실전에서 어떻게 활용되는지 알아보았습니다. 포인터는 초보자에게 어려운 주제일 수 있지만, 이를 잘 이해하면 C 언어를 더욱 효율적으로 사용할 수 있습니다.

반응형