Automotive/C

[C/C++] 포인터 배열 및 복잡한 함수 포인터

코딩쪼앙 2024. 9. 10. 11:30

포인터 배열

배열의 요소로 포인터 변수를 가지는 배열 -> 포인터 변수로 이루어진 배열

아래와 같이 선언한다.

int num1 = 1, num2 = 2, num3 = 3;
int *arr[3] = {&num1, &num2, &num3};

포인터 배열의 주소 연산

포인터 배열의 주소 또한 연산이 가능하다. 주소 값을 곱하거나 나눌 수 없으므로 주소 연산은 덧셈과 뺄셈만 가능하다.

#include <stdio.h>

int main() {

    int values[] = {10, 20, 30, 40, 50};

    // 정수 포인터 배열 선언
    int* pointers[5];

    // 포인터 배열에 주소 지정
    for (int i = 0; i < 5; ++i) {
        pointers[i] = &values[i];
    }

    // 포인터 배열 출력
    printf("주소, 값:\n");
    for (int i = 0; i < 5; ++i) {
        printf("pointers[%d] = %p, value = %d\n", i, (void*)pointers[i], *pointers[i]);
    }

    // 포인터 연산을 통한 주소 덧셈과 뺄셈
    printf("\n주소 연산:\n");

    // 포인터 덧셈: pointers[0] + 2
    int* ptr_add = pointers[0] + 2;
    printf("pointers[0] + 2 = %p, value = %d\n", (void*)ptr_add, *ptr_add);

    // 포인터 뺄셈: pointers[3] - 1
    int* ptr_sub = pointers[3] - 1;
    printf("pointers[3] - 1 = %p, value = %d\n", (void*)ptr_sub, *ptr_sub);

    return 0;
}
더보기
더보기

포인터 변수로 선언 후 주소 연산, 주소 출력 위해 (void*)로 타입 캐스팅


복잡한 포인터 사용

#include <stdio.h>

typedef int(*FUNC) (int,int);

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

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

// (int,int)를 받아 int를 리턴하는 포인터 calc 미리 선언
FUNC calc(FUNC fp[], int arr_size) {
    return fp[0];
}

// int (*(calculator(int (*fp[])(int, int), int arr_size)))(int, int) //
/*
 * 1. int (*fp[])(int, int)
 *  (int,int)를 매개변수로 받아 int를 반환하는 함수포인터의 배열
 *
 * 2. *(calculator(int (*fp[])(int, int), int arr_size))
 *    1번과 1번의 size를 입력 받아 1번(함수포인터 배열)에 저장되어있는
 *    각 함수를 반환하는 함수포인터
 *
 * 3. 2번(함수포인터 -> 각 함수의 주소를 가지고 있음)에
 *    (int,int)를 입력받아 int를 반환
 */

int main() {
    // 1번 function pointer의 배열 선언
    FUNC functions[] = {add, substract};
    // 위에 선언한 2번을 받아 계산을 수행하는 3번 변수
    FUNC const operation = calc(functions, 2);
    int result = operation(2, 3);
    printf("%d\n", result);
    return 0;
}

'Automotive > C' 카테고리의 다른 글

[C/C++] 문자열 포인터  (2) 2024.07.26
[C/C++] Pointer 및 Const  (1) 2024.07.24