2014-11-27 2 views
-3

나는 현재 내 C-중간 고사를 위해 공부하고 INT의 푸 내가이 선언 발생했습니다무엇 ** foo는 [] []()

int **foo[][]()  

어떤이 선언의 수단으로 해결책을 찾고 내 튜터는 실제로 두 가지 다른 대답을했습니다. 1) foo는 반환 유형이있는 배열의 배열입니다. 2) foo는 반환 유형이 int 인 함수에 대한 포인터에 대한 포인터 배열의 배열입니다. I "변수의 이름으로 시작하고 끝까지 도달 할 때까지 계속하십시오.") 그리고 나서 마지막 시작점으로 돌아가서 시작점에 도달 할 때까지 왼쪽으로 계속하십시오.1) 여기에 정답이라고 생각하지만 나는 완전히 확신하지 못합니다.

감사합니다, Ozelotl

+0

http://cdecl.org 알 수없는 많은 치수가 너무 적습니다. – Deduplicator

+1

[cdecl.ridiculousfish.com/?q=int+**foo\[\]\[\]()](http://cdecl.ridiculousfish.com/?q=int+**foo[][]% 28 % 29) : "int 포인터를 가리키는 포인터를 반환하는 배열의 배열". – ruakh

+1

표제 : 프로그램에서 사용하여 왜 * 테스트하지 않았습니까? – Deduplicator

답변

0

이 선언의 구문은 foo[][]는 2 차원 배열을 선언한다는 것입니다 (또는 바인딩 두 번째 차원을 한 경우는, 지정된 것 - 그것은 그 불법의 약자로); 후 나머지는 다음 함수 지정되지 않은 인수를 복용하고 int **을 반환이다

int **bar(); // with bar = foo[][] 

. 그러나 여기서 bar은 배열 유형이므로이 함수는 불법 인 함수 배열을 선언하려고 시도합니다. (함수 포인터의 배열과 혼동해서는 안된다.).

문법 규칙

은 그 int** 바인드 (안 bar에) 당신이 bar에 바인딩을 강제로 괄호를 사용하지 않는; 따라서 그들은 int ** 유형의 일부이며 그들은 bar이 포인터라고 말하지 않습니다.

1

아무 것도 구체적이지 않습니다. 표면적으로 C 선언처럼 보이지만 잘 형성되어 있지 않다는 것을 의미합니다. 그것은 불법이며 그 자체로 의미가 없습니다.

첫째, 2 차원 배열 선언처럼 보이지만 C 언어에서는 맨 처음 배열 선언을 제외하고 모든 크기를 지정하려면 배열 선언이 필요합니다. 귀하의 선언은 불법으로 만드는 두 번째 크기도 생략합니다.

둘째, 누락 된 크기를 무시하는 경우에도 함수 배열에 대한 선언처럼 보입니다. 예를 들어,이 법적 C 선언

int (**foo[][42])() 

을 만들 것입니다하지만 당신은 원래없는 것을 가지고 C.

에서 함수의 배열을 선언하는 것은 불법입니다.