안녕하세요
질문이 있어서 문의글 남겨요
69.8 의 오답설명을 보고 테스트 통과는 했으나 도저히 어떻게 돌아가는건지 몰라서 분석을 해보았습니다
문의한 코드는 삭제합니다.
제가 분석한 결과가 맞는지 틀린부분은 어떤부분이 있는지 확인좀 부탁드립니다.
감사합니다.
(도장_ 관리자님이 수정함 - 원문 제출일: 2019년 10월 26일, 토요일, 오후 11:20)
포인터 함수 fp를 구조체 형태로 선언
->
Person 구조체 포인터를 인자로 받는 fp(함수 포인터)를 배열 형태로 선언
안녕하세요
추가질문 드립니다.
1. 69.4 함수 포인터를 함수의 반환값으로 사용하기 를 보면,
int (*getAdd())(int, int); 형태로 사용이 되어서
69.8에서 void (*getPrintFunc())(struct Person*) 로 수정하니 오류가 없이
구동이 되네요
(struct Person*)은 return시 값이 반환되는 자료형이고,
(*getPrintFunc(struct Person* p)) 의 매개변수자료형 매개변수는 정확하게 의미하는 바가 뭔지 알수있을까요?
안들어가도 오류가 나지않는 이유가 있을까요?
함수포인터반환값자료형 (*함수이름(매개변수자료형 매개변수))(함수포인터매개변수자료형1, 함수포인터매개변수자료형2)
2.
struct Person {
char name[30];
int age;
void (*print)(struct Person*);
};
void print(struct Person* p)
{
printf("%s %d\n", p->name, p->age);
}
구조체 struct Person 안에서 print 함수를 선언후 메인함수에서 하기와 같이
구조체 안에 있는 print 함수 선언에 print 함수 주소를 저장해주는데
struct Person p[3];
p[0].print = print;
이렇게 하는 특별한 이유가 있나요??
fp[i] = getPrintFunc(&p[i]); 에서 return print; 를 해서 void (*fp[3])(struct Person*);
에 저장하게 되고 void executer에서 fp[i](&p[i]); 하면 fp에 이미 print 함수가 호출된
상태가 되는거 아닌가요?
구조체 내부에 print함수를 호출해주는 이유가 뭔지 설명 부탁드립니다.
69.8은 하나하나 분석을 해놓고 반복해서 다시 읽어봐도 모든 함수의 매개변수가 struct Person형태로 되어있는 이유를 사실상 이해하기가 어렵네요...
갈수록 이해가 안되고 어려워서 시간도 많이들고 힘이드네요
원래 어려운건지 저만 어려운건지... ㅜㅜ
UNIT 68 함수 포인터를 다시 살펴보고 이해하는 게 필요합니다.
포인터도 어렵지만, 함수 포인터는 더 어려워하는 개념입니다.
어려운 게 맞습니다.
UNIT 68.1에 보면
void (*fp)(); // 반환값과 매개변수가 없는 함수 포인터 fp 선언
void이니 반환값이 없고, ()이니 매개변수가 없습니다.
이게 함수 포인터인지 어떻게 알아요? 부터 생각해보죠.
void *fp()
뒤에 ;도 없습니다. 함수 선언이기 때문이죠.
함수 포인터라는 것을 구분하기 위해 함수 이름과 *을 함께 감쌉니다.
void (*fp)(); // 반환값과 매개변수가 없는 함수 포인터 fp 선언이렇게 선언되어야 fp는 함수 포인터이고, 이 함수 포인터는 반환값과 매개변수가 없는 함수를 지정할 수 있습니다.
UNIT 68.1 예제를 다시 살펴보세요.
#include <stdio.h>
void hello() // 반환값과 매개변수가 없음
{
printf("Hello, world!\n");
}
void bonjour() // 반환값과 매개변수가 없음
{
printf("bonjour le monde!\n");
}
int main()
{
void (*fp)(); // 반환값과 매개변수가 없는 함수 포인터 fp 선언
fp = hello; // hello 함수의 메모리 주소를 함수 포인터 fp에 저장
fp(); // Hello, world!: 함수 포인터로 hello 함수 호출
fp = bonjour; // bonjour 함수의 메모리 주소를 함수 포인터 fp에 저장
fp(); // bonjour le monde!: 함수 포인터로 bonjour 함수 호출
return 0;
}
이 기본 구조를 철저하게 이해한 다음에 UNIT 68.2의 반환값과 매개변수가 있는 함수 포인터를 이해할 수 있을 것입니다.
struct Person*을 왜 쓰느냐는 질문은 그래서 함수 포인터 선언 자체를 이해하지 못한 것으로 보입니다.
UNIT 68을 철저하게 복습하고, 책을 보지 않고 스스로 함수 포인터를 작성할 수 있을 때까지 예제를 반복해서 작성해보세요. 빈 코드 창에서 전체 예제를 스스로 작성할 수 있게 반복해서 연습하고, 매개변수가 있는 함수 포인터, 반환값이 있는 함수 포인터를 작성하는 형태로 하나씩 응용해서 연습하세요.
그러면 자연히 해결됩니다.
구조체 안에 print 함수 포인터를 둬서 원하는 형태로 출력을 지정한 함수를 지정할 수 있음을 보여주기 위한 예제입니다.
이름, 나이
이름(나이)
이런 형태로 출력 방식을 다르게 만든 출력 함수를 만들어서 print 함수 포인터에 지정할 수 있습니다.