본문 바로가기
대외활동/시스템프로그래밍

보이드 포인터, 함수 포인터 복습

by hoshi03 2024. 8. 21.

• 보이드 포인터

 

    void *ptr;
    int tmp = 10;
    ptr = &tmp;
    printf("%d", *(int *)ptr);

보이드 포인터로 선언하고 

보이드포인터  = 특정 자료형 으로 대입한 후

(특정 자료형 *) 형태로 가져와서 쓸 수 있다

 

#include <stdio.h>

void print_first_element(void *arr, char type) {
    if (type == 'i') {
        printf("첫 번째 정수형 요소: %d\n", *((int*)arr));
    } else if (type == 'f') {
        printf("첫 번째 실수형 요소: %f\n", *((float*)arr));
    } else {
        printf("알 수 없는 타입입니다.\n");
    }
}

int main() {
    int int_arr[] = {10, 20, 30};
    float float_arr[] = {1.1f, 2.2f, 3.3f};

    print_first_element(int_arr, 'i');
    print_first_element(float_arr, 'f');

    return 0;
}

 

메서드나 배열에서 받아올 때도 특정 자료형 요소로 명시적 캐스팅해서 가져올 수 있다

 

#include <stdio.h>
#include <string.h>

typedef struct {
    char name[50];
    int age;
} Student;

void print_student_info(void *student_ptr) {
    Student *student = (Student*)student_ptr;
    printf("이름: %s\n", student->name);
    printf("나이: %d\n", student->age);
}

int main() {
    Student s1;
    strcpy(s1.name, "홍길동");
    s1.age = 20;

    print_student_info(&s1);

    return 0;
}

 

사용자가 정의한 구조체 포인터로도 받아서 변환해서 사용 가능하다

 

• 함수 포인터

 

#include <stdio.h>

// 두 정수를 더하는 함수
int add(int a, int b) {
    return a + b;
}

// 두 정수를 곱하는 함수
int multiply(int a, int b) {
    return a * b;
}

// 연산을 수행하는 함수
void perform_operation(int (*operation)(int, int), int x, int y) {
    printf("결과: %d\n", operation(x, y));
}

int main() {
    int choice, x, y;
    int (*func_ptr)(int, int);

    printf("두 정수를 입력하세요: ");
    scanf("%d %d", &x, &y);

    printf("1. 덧셈\n2. 곱셈\n선택하세요: ");
    scanf("%d", &choice);

    if (choice == 1) {
        func_ptr = add;
    } else if (choice == 2) {
        func_ptr = multiply;
    } else {
        printf("잘못된 선택입니다.\n");
        return 1;
    }

    perform_operation(func_ptr, x, y);

    return 0;
}

 

 

!

보이드 포인터에 진행할 연산을 저장해두고 다시 그 보이드 포인터를 특정 자료형 함수포인터에 대입해서 연산하는 코드

#include <stdio.h>

// 두 정수를 더하는 함수
int add(int a, int b) {
    return a + b;
}

// 두 정수를 곱하는 함수
int multiply(int a, int b) {
    return a * b;
}

// 연산을 수행하는 함수
void perform_operation(void* func, int x, int y) {
    int (*operation)(int, int)= (int (*)(int, int)) func;
    printf("결과: %d\n", operation(x, y));
}

int main() {
    int choice, x, y;
    void *func_ptr;
    int (*func)(int, int);

    printf("두 정수를 입력하세요: ");
    scanf("%d %d", &x, &y);

    printf("1. 덧셈\n2. 곱셈\n선택하세요: ");
    scanf("%d", &choice);

    if (choice == 1) {
        func_ptr = (void *)add;
    } else if (choice == 2) {
        func_ptr = (void *)multiply;
    } else {
        printf("잘못된 선택입니다.\n");
        return 1;
    }

    func = (int (*)(int, int))func_ptr;
    printf("%d",func(x,y));

    return 0;
}

 

연산을 받아들일 void 포인터를 만들어 둔 후

특정 연산을 (void *)메서드 형태로 보이드 포인터로 캐스팅해서 저장하고

보이드 포인터를 함수 포인터 형태로 다시 형변환해서

값을 가져오게 코드를 작성했다

 

#include <stdio.h>
#include <stdlib.h>

// 사칙연산 함수들 선언
int add(int a, int b) {
    return a + b;
}

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

int multiply(int a, int b) {
    return a * b;
}

int divide(int a, int b) {
    if (b == 0) {
        fprintf(stderr, "Division by zero\n");
        exit(EXIT_FAILURE);
    }
    return a / b;
}

// 함수 포인터 타입 정의
typedef int (*Operation)(int, int);

// 연산자를 받아 적절한 함수 포인터를 반환하는 함수
Operation getOperation(char op) {
    switch (op) {
        case '+':
            return add;
        case '-':
            return subtract;
        case '*':
            return multiply;
        case '/':
            return divide;
        default:
            fprintf(stderr, "Invalid operator\n");
            exit(EXIT_FAILURE);
    }
}

int main() {
    int x, y;
    char op;

    // 사용자로부터 입력 받기
    printf("Enter first integer: ");
    scanf("%d", &x);
    printf("Enter an operator (+, -, *, /): ");
    scanf(" %c", &op);  // 앞에 공백을 넣어 개행 문자를 무시합니다.
    printf("Enter second integer: ");
    scanf("%d", &y);

    // 적절한 연산 함수 선택
    Operation operation = add;

    // 함수 포인터를 사용하여 연산 수행
    int result = operation(x, y);
    printf("Result: %d\n", result);

    return 0;
}

 

 

보이드 -> 함수포인터

함수 -> 보이드 -> 함수 형태로도 사용 가능하다

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

int mul(int a, int b){
    return a * b;
}

int oper(void * func, int x, int y){
    int (*op)(int, int) = (int(*)(int, int))func;
    return op(x,y);
}

int main() {
    int x, y;
    char op;
    void (* func_ptr)(int, int);
    scanf("%d %d %c", &x, &y, &op);
    if(op == '+') func_ptr = (void *) add;
    else if(op == '*') func_ptr = (void *) mul;
    printf("%d\n", oper(func_ptr, x, y));
    int (*pFunction)(int, int) = (int (*)(int, int)) func_ptr;
    printf("%d\n", pFunction(x, y));
}

'대외활동 > 시스템프로그래밍' 카테고리의 다른 글

라이브러리  (0) 2024.08.22
0822 gdb, core, valgrind  (0) 2024.08.22
리눅스 쉘 스크립트 조건문  (0) 2024.08.21
리눅스 쉘 프로그래밍  (0) 2024.08.20
리눅스 명령어 정리 & 예제  (0) 2024.08.17