C

함수포인터2 좀 더 상세 포인터 배열 조금 더

parkrams 2024. 2. 1. 18:28
728x90

함수포인터

#include <stdio.h>

int isOdd(int value) {

    if (value % 2 != 0) return 1;

    return 0;
}

int isEven(int value) {

    if (value % 2 == 0) return 1;

    return 0;
}


void showIf(int* arr, int size, int (*pred)(int)) {  // 배열의 시작, 배열의 길이, 함수 포인터

    for (int i = 0; i < size; i++) {
        if (pred(arr[i])) printf("%d", arr[i]);

        puts("");
    }
}



int main(void) {

    int a[10] = { 1,2,3,4,5,6,7,8,9,10 };

    showIf(a, 10, isOdd);   // isOdd = 함수의 주소 // 함수의 이름만쓰면 함수의 주소를 호출
    showIf(a, 10, isEven);   // isOdd = 함수의 주소

}
  • showIf(a, 10, isOdd) 여기서 isOdd 에서 함수 호출은 일어나지 않는다.
    • 함수의 이름만 쓸 경우 함수의 주소를 말한다.
    • showIf 함수에 isOdd 함수를 주소로 보내기 때문에 showIf 함수 마지막 인수는 주소를 받을 수 있는 포인터로 받아줘야 한다.
      • int (*pred)(int)

포인터 배열

    // 포인터 배열 

    int a[4] = { 1,2,3,4 };
    int b[4] = { 5,9,7,8 };

    int* pa[2];

    pa[0] = a; // a 배열의 시작인 1의 주소를 저장
    pa[1] = b;    // b 배열의 시작인 2의 주소를 저장


    printf("%d \n", *pa[1]); // 시작 지점 5  배열 밖 [] + 1 을 하면 시작 주소 5 다음 값인 9를 출력한다.
    printf("%d \n", *(pa[1] + 1)); // 9 
  • int *pa[2] 로 배열을 저장할 포인터 배열 변수를 선언
    • 이후 pa[1]에 a pa[2]에 b 배열을 대입한다.
      • pa[0] = a 는 a 배열의 첫 번째 인덱스가 저장된다.
      • pa[1] = b 는 b 배열의 첫 번째 인덱스가 저장된다.
  • *(pa[0] + 1) 호출로 a 의 두 번째 인덱스를 불러올 수 있다.
    • 괄호가 중요하다. 괄호가 없으면 단순히 + 연산자가 실행 되므로 주의 필요
728x90