아래의 배열 선언 유형은 무엇입니까? 누가 나를 위해 명확하게 말할 수 있습니까?다른 배열 선언 유형
int main() {
int* arr[3];
int(*arr)[3];
int*(arr[3]);
}
아래의 배열 선언 유형은 무엇입니까? 누가 나를 위해 명확하게 말할 수 있습니까?다른 배열 선언 유형
int main() {
int* arr[3];
int(*arr)[3];
int*(arr[3]);
}
당신은 도와 cdecl를 사용할 수 있습니다
int *arr[3]
"는 포인터의 배열 (3) int로로 ARR 선언"제공합니다.int (*arr)[3]
는 int*(arr[3])
또한 물론 이것은 "실제"선언이 아닙니다. 종결 세미콜론이없고 동일한 범위에 arr
이라는 세 가지 변수를 사용할 수 없습니다.
’ 일반적으로 소스 코드를 해독하는 도구 대신에 사용하는 언어를 알고 있으므로 C 선언 분석기를 사용하지 않는 것이 좋습니다.
우선 순위를 기억하는 쉬운 방법은 main
의 서명, 즉
auto main(int argc, char* argv[])
-> int
중 & hellip을 기억하는 것입니다; 여기서 argv
은 포인터의 배열 (또는 기술적으로는 그러한 배열의 첫 번째 요소에 대한 포인터 : 선언은 char** argv
으로 감쇠 됨)임을 알고 있습니다.
에 해당하는 괄호 선언
char* (argv[])
선언이되도록 색인이하는 char
을 얻을 수있는 결과를 역 참조 후, 포인터, argv[i]
을 얻는다면, 할 수 argv
주어진 것을 의미
char (*b)[3]
, 즉 즉 b
, *b
를 역 참조하여 의미 당신은 (*b)[]
, 그리고 b
배열에 대한 포인터입니다 색인을 생성 할 수있는 배열을 얻을.
’ 이러한 배열의 첫 번째 항목에 대한 포인터가 아닙니다. ’ 포인터는 배열 자체에 대한 포인터입니다. 따라서 1을 b
에 추가하면 동일한 크기의 다음 배열에 대한 포인터가 생깁니다. 이러한 []
및 함수 호출 ()
같은
후위 연산자는 단항 *
보다 높은 우선 순위를 가지므로 *a[N]
같은 선언 *(a[N])
로서 해석이나 "포인터 N 소자 어레이"한다. "N 요소 배열에 대한 포인터"를 선언하려면 배열 이름으로 *
또는 (*a)[N]
이라는 단항 문자를 명시 적으로 그룹화해야합니다.
다음은 유용한 차트입니다.
T a[N] -- N-element array of T
T *a[N] -- N-element array of pointer to T
T (*a)[N] -- pointer to N-element array of T
T f() -- function returning T
T *f() -- function returning pointer to T
T (*f)() -- pointer to function returning T
당신은 꽤 복잡한 선언에 위를 결합 할 수 있습니다 :
f -- f
f() -- is a function returning ("()" has higher precedence than "*")
*f() -- a pointer to
(*f())[N] -- an N-element array of
*(*f())[N] -- pointers to
(*(*f())[N])[M] -- M-element arrays of
T (*(*f())[N])[M] -- T
: 털이 선언을 읽을 때
T (*a[N])() -- N-element array of pointers to functions returning T
T (*f())[N] -- Function returning pointer to N-element array of T
T (*(*f())[N])[M] -- Function returning pointer to N-element array of pointer
to M-element array of T
는, 위의 규칙을 기억, 가장 왼쪽 식별자로 시작하고 밖으로 당신의 방법을 작동
http://c-faq.com/decl/spiral.anderson.html – chris
http://cdecl.org/ – P0W
첫 번째와 세 번째는 동일합니다. –