C언어 typedef 와 함수포인터에서 질문좀 드립니다..

조회수 2097회

안녕하세요, 자료구조 공부중에 소스를 읽는데 문법에서 이해가 잘 가질 않는 부분이 있어서 질문드립니다.

typedef void VisitFuncPtr(BTData data);

void InorderTraverse(BTreeNode* bt, VisitFincPtr action) // 중위 순회
{
    if (bt == NULL) // bt가 NULL이면 재귀 탈출
        return;

    InorderTraverse(bt->left, action);  // 1단계 왼쪽서브 트리의 순회
    action(bt->data);                   // 2단계 루트노드의 방문
    InorderTraverse(bt->right, action); // 3단계 오른쪽서브트리의 순회

}

소스의 일부만 있으면 될것같아서 소스의 일부만 올리지만 혹 전체 소스가 필요하다하시면 수정해서 올려드리겠습니다. 책에서 이진트리 공부중 노드를 순회,방문 하는 소스에서 함수포인터를 사용하는 부분이 나왔습니다. 함수포인터를 사용하는데 위 소스처럼 typedef void VisitFuncPtr(BTData data); 를 사용하더군요. typedef로 함수포인터를 사용하는건 처음이라 생소했지만 일반 typedef와 다를게 있나 싶어 읽었지만, 처음에 이 문장을보고 뭐지? 내가 아는 함수포인터 모양이 아닌데? 하고 생각했지만 뒤를 더 보면 뭔가 나올것 같아서 계속 읽어보았습니다. 하지만 읽어도 읽어도 잘 이해가 가질않아 여기다가 글을 남깁니다.

제가 c언어 기초를 공부했을때 공부했던 함수포인터의 모양대로라면 void (*VisitFuncPtr)(BTData data); 이런 모양이어야 했을겁니다. 반환형이 void이고 포인터변수? 이름은 VisitFuncPtr이고 매개변수 데이터형은 BTData 하나인 함수포인터.. 이런식으로 말입니다. 그리고 제가 공부했던 typedef의 문법대로라면 끝에 별칭? 같은 것이 있어야하는데 없습니다. typedef int ABC 에서 int를 ABC로 쓰는것과 같이요.

그런데 저런식으로 쓰고 함수포인터라고하니 당황스럽네요.

심지어 다음 InorderTraverse(BTreeNode* bt, VisitFincPtr action) 함수에서 VisitFuncPtr action 이 매개변수를 어떻게 해석을 해야할지 감이 안잡힙니다..action이 VisitFuncPtr의 변수명인지? 그렇다면 VisitFuncPtr은 타입이라는 말인데 VisitFuncptr은 함수포인터이름이지 타입이아닌데,,헷갈리네요 매개변수에서도 막히니 몸체에서 action(bt->data); 부분도 어떻게 해석이 돼야할지 감은 뭔가 잡히는데 정확하질 않아서 헷갈리기만합니다

제가 평소에 알고 있던 문법들 같긴하지만 조금 다르게 나오니 잘이해가 가지를 않는데요, 모르는 부분이라 질문드리니 사소한것이지만 답변좀 해주시면 감사하겠습니다.

1 답변

  • 말씀하신 void (*VisitFuncPtr)(BTData data); 은 VisitFunctionPtr 변수 선언입니다. 그렇기 때문에 VisitFuncPtr = a; 는 가능하지만, VisitFuncPtr a; 는 불가능합니다. 책에 나와 있는 typedef void VisitFuncPtr(BTData data); 변수타입 재정의 입니다. 그렇기 떄문에 VisitFuncPtr a; 는 가능하고 VisitFuncPtr = a ; 는 불가능합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • typedef void VisitFuncPtr(BTData data); 에서 변수타입 재정의라는 말씀은 VisitFuncPtr이라는 타입을 새로 정의한다는 말씀이신가요? codeslave 2018.6.30 00:04
    • 예 그렇습니다 void (*)(BTData data)라는 타입을 VisitFuncPtr로 간단히 적겠다고 선언하는 겁니다. 알 수 없는 사용자 2018.7.12 22:36
    • 예 그렇습니다 void (*)(BTData data)라는 타입을 VisitFuncPtr로 간단히 적겠다고 선언하는 겁니다. 알 수 없는 사용자 2018.7.12 22:36
    • 예 그렇습니다 void (*)(BTData data)라는 타입을 VisitFuncPtr로 간단히 적겠다고 선언하는 겁니다. 알 수 없는 사용자 2018.7.12 22:37

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)