C 포인터에서 우선 순위는 어떻게 결정됩니까?


14

이해하기 어려운 두 가지 포인터 선언을 보았습니다. 우선 순위 규칙에 대한 나의 이해는 다음과 같습니다.

Operator             Precedence             Associativity
(), [ ]                  1                  Left to Right
*, identifier            2                  Right to Left
Data type                3

그러나 이것조차도 다음 예제를 올바르게 평가하는 방법을 알 수없는 것 같습니다.

첫 번째 예

float * (* (*ptr)(int))(double **,char c)

내 평가 :

  1. *(ptr)
  2. (int)
  3. *(*ptr)(int)
  4. *(*(*ptr)(int))

그때,

  1. double **
  2. char c

두 번째 예

unsigned **( * (*ptr) [5] ) (char const *,int *)
  1. *(ptr)
  2. [5]
  3. *(*ptr)[5]
  4. *(*(*ptr)[5])
  5. **(*(*ptr)[5])

어떻게 해야 내가 그들을 읽어?


1
언어가 기능을 처리하는 방법에 대한 질문은 여기에서 주제입니다.

답변:


7

첫 번째에 대한 내 추측 : 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 *)

논쟁과 귀환으로

부호없는 **


7

'The Clockwise Spiral'Method를 사용하여 이러한 미친 선언을 이해할 수 있습니다.

http://c-faq.com/decl/spiral.anderson.html

나는 여기에 블로그를 올렸다.

http://www.kalekold.net/index.php?post=4


답장을 보내 주셔서 감사합니다. 그러나 시계 방향 나선형 방법에서 필자의 경우 어디에서 시작해야합니까? 링크에 주어진 예에는 간단한 예가 있습니다. 방정식과 해당 방법을 일치시킬 수 없습니다.
trapaank

1
식별자 ptr에서 시작해야합니다. "ptr은 int를 취하고 double과 char에 대한 포인터를 가리키는 함수를 가리키는 함수에 대한 포인터를 리턴하고 float에 대한 포인터를 리턴하는 함수에 대한 포인터"입니다. spyral을 시도하면 같은 결과를 얻을 수 있습니다.
Remo.D

1

함수 포인터입니다. 그것을 작성한 사람은 typedef를 더 잘 사용하여 더 명확하게 만들 수 있습니다.

사실상 이러한 매개 변수로 작동하는 포인터입니다. float * myfunc (더블 **, 문자)


4
내 생각은 그것을 쓴 사람이 선생님이라는 것입니다.
mouviciel

이 같은 쓰레기를 알 필요가 없기 때문에 그것이 선생님이 아니기를 바랍니다. 좋은 선생님이 먼저 이런 식으로 얼굴을 때리고 머리를 긁어 해석을 시작한 다음 typedef를 올바르게 사용하는 방법을 보여줄 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.