이해하기 어려운 두 가지 포인터 선언을 보았습니다. 우선 순위 규칙에 대한 나의 이해는 다음과 같습니다.
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
그러나 이것조차도 다음 예제를 올바르게 평가하는 방법을 알 수없는 것 같습니다.
첫 번째 예
float * (* (*ptr)(int))(double **,char c)
내 평가 :
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
그때,
double **
char c
두 번째 예
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
어떻게 해야 내가 그들을 읽어?
답변
첫 번째에 대한 내 추측 : ptr은 매개 변수를 int로 사용하는 함수에 대한 포인터이며 double 및 char에 대한 포인터를 매개 변수로 사용하는 함수에 대한 포인터를 반환하고 float에 대한 포인터를 반환합니다.
해석 :
(* ptr) (int)
ptr은 int를 인수로 사용하는 함수에 대한 포인터라고 말합니다. 그 함수가 무엇을 반환하는지 알아 내려면 뷰를 확장해야합니다.
(* (* ptr) (int))
이것은 함수가 다른 함수에 대한 포인터를 반환한다는 것을 의미합니다. 다른 기능의 매개 변수는 다음과 같습니다.
(더블 **, 문자 c)
그리고 그것은 반환
플로트 *
그리고 두 번째 것 : ptr은 매개 변수로 char에 대한 상수 포인터와 int에 대한 포인터를 가져 와서 unsigned int의 포인터에 대한 포인터를 반환하는 함수에 대한 5 개의 포인터 배열에 대한 포인터입니다.
해석 :
(* (* ptr) [5])
함수에 대한 5 개의 포인터 배열에 대한 포인터로 ptr을 선언합니다.
(char const *, int *)
논쟁과 귀환으로
부호없는 **
답변
‘The Clockwise Spiral’Method를 사용하여 이러한 미친 선언을 이해할 수 있습니다.
http://c-faq.com/decl/spiral.anderson.html
나는 여기에 블로그를 올렸다.
답변
함수 포인터입니다. 그것을 작성한 사람은 typedef를 더 잘 사용하여 더 명확하게 만들 수 있습니다.
사실상 이러한 매개 변수로 작동하는 포인터입니다. float * myfunc (더블 **, 문자)
답변
cdecl.org 사용 :
char * const (* (* const bar) [5]) (int)
함수에 대한 포인터의 배열 5에 대한 const 포인터로 bar 선언 (int) char에 const 포인터를 반환
부호없는 ** (* (* ptr) [5]) (char const *, int *)
함수에 대한 포인터의 배열 5에 대한 포인터로 ptr을 선언하십시오 (const char에 대한 포인터, int에 대한 포인터) unsigned에 대한 포인터에 대한 포인터 반환