ft_lstdelone 함수 구현

윤효준·2024년 9월 2일

42 Libft 복습

목록 보기
27/28

typedef struct s_list
{
	void			*content;
	struct s_list	*next;
}	t_list;

void	ft_lstdelone(t_list *lst, void (*del)(void *))
{
	(*del)(lst->content);
	free(lst);
}

ft_lstdelone 함수는 함수 포인터를 전달 받고 lst를 free해준다.
함수의 요구사항에 맞춰 구현하면 위와 같다!

함수 포인터란???

모든 변수가 메모리 내에 위치하여 주소가 있듯이 함수 또한 메모리 내에 위치하고 있으므로 주소가 있다. 모든 함수는 메모리에 로드되면 고유한 시작 주소를 가지고 이 주소를 통해 호출될 수 있다.

함수 포인터 사용법

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

int (*func_ptr)(int, int) = &add;  // 함수 포인터에 함수 주소 할당

// 두 가지 호출 방법
int result1 = (*func_ptr)(2, 3);   // 명시적인 역참조
int result2 = func_ptr(2, 3);      // 역참조 없이 호출

printf("%d, %d\n", result1, result2);  // 결과는 동일: 5, 5

위의 예시를 보면 하나는 역참조를 진행했고 하나는 역참조를 진행하지 않았다.
변수에서 해당 주소의 값을 이용하고 싶을 때는 역참조를 진행한다.
함수 포인터 또한 동일하게 해당 주소의 함수를 이용하고 싶으면 원칙적으로는 역참조를 진행해야 한다.
하지만 함수 호출 시의 문법적 편의성 때문에 역참조없이 함수 포인터를 호출해도 컴파일러가 함수 포인터와 함수 이름 간의 차이를 자동으로 처리해주기 때문에 함수 포인터를 역참조하지 않고도 마치 일반 함수처럼 호출할 수 있다.

함수 포인터의 필요성

1. 동적 함수 호출

아래 예시를 보자

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

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

int (*operation)(int, int);  // 함수 포인터 선언

// 조건에 따라 다른 함수를 호출
if (condition == 1) {
    operation = add;
} else {
    operation = subtract;
}

int result = operation(10, 5);  // 런타임에 결정된 함수 호출
int result = (*operation)(10, 5);  // 원칙적으로는 이렇게 사용해야 함

위와 같이 함수 포인터는 상황에 맞춰 적절한 함수를 호출할 수 있는 유연성을 제공한다.

2. 배열을 통한 함수 관리

여러 함수를 배열에 저장하고 배열의 인덱스에 따라 함수를 호출할 수 있다.
함수 포인터를 배열을 사용하면 여러 함수를 쉽게 관리하고 호출할 수 있는 유연성을 얻을 수 있따다.

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 (*operations[3])(int, int) = { add, subtract, multiply };
int (*operations[3])(int, int) = { &add, &subtract, &multiply }; //원칙적으로는 이렇게 사용해야 함

// 배열의 인덱스를 사용해 함수를 호출
int result = operations[2](10, 5);  // multiply(10, 5) 호출
profile
작은 문제를 하나하나 해결하며, 누군가의 하루에 선물이 되는 코드를 작성해 갑니다.

0개의 댓글