Declaration(선언)과 Definition(정의)
Declaration(선언) 과 Definition(정의) 를 구분하는 경우, memory 를 실제로 요청해서 할당받으면 definition 이고, 단지 대상의 type을 알리는 문장이면 declaration 이다. 참고로, 함수의 경우, 원형(prototype)의 선언 없이 정의하면, 정의와 동시에 선언된다.


Data Types (자료형)
메모리에 저장하고 꺼내는 데이터의 크기, 용도, 사용법 등의 정보를 뭉뚱구려서 data의 type이라고 한다.
primitive types (int, char, float, double, void) 도 있고, 그러한 타입들을 재료로 구성되는 타입도 있다.


Types in C
C 의 선언 형식은, 이름이 나타내는 대상에 대해, 어떠한 행위를 했을때, 결과적으로 어떤 primitive 값을 얻게 되는가 형식으로 되어있다.
(NOTE: C++ 의 경우는, type distinction 만 가능하면 여기저기 끼워넣은 내용이 많기 때문에, 이처럼 심플하고 일관되게 설명되지 않는다. 반면에, C 는 매우 심플하고 일관되게 설명이 가능하다.)

선언 대상은, 선언에 등장하는 첫번째 이름이고,
선언 type 은, 대상의 선언에 사용된 이름들, 값, 함수정의 block 등을 제외한 것이다.
(참고로, 보통 함수의 경우, 이런걸 signature 라고 하고, 보통 다른 언어에서는 overload 시 올바른 함수를 고르거나 할 때 사용된다.)

int a;

이름 a 는, 그대로, int 값을 준다.
type 은 int <-- 이름 (identifier) a 를 빼고 남은 부분.


int *a;

이름 a 는, 전위 * 에 의해, int 값을 준다.
type 은 int *                                                                            <-- 마찬가지로 이름 (identifier) a 를 빼고 남은 부분.


int a[7];

이름 a 는, 후위 [ ] 에 의해, int 값을 준다.
type 은 int [ ]


int *a[7];

이름 a 는, 후위 [ ] 후, 전위 * 에 의해, int 값을 준다. (주의: 연산자 우선순위)
type 은 int * [ ]


int (*a)[7];

이름 a 는, 전위 * 후, 후위 [ ] 에 의해, int 값을 준다. (NOTE: 괄호를 통한 연산자 우선순위 변경)
type 은 int (*)[ ]


int a( int b, int c);

이름 a 는 후위 ( int ) 에 의해, int 값을 준다.         --> 즉, arg : int 한개 pass, 호출 결과 int
type 은 int (int)


int a( int b, int c);

이름 a 는 후위 ( int, int ) 에 의해, int 값을 준다. --> 즉, arg : int 2개 pass, 호출 결과 int
type 은 int (int, int)


int a( int *b, int c[ ] );

이름 a 는 후위 (int *, int [ ]) 에 의해, int 값을 준다. --> 즉, arg : int* 와 int [ ] pass, 호출 결과 int
type 은 int( int*, int[ ] )


int *a( int b);

이름 a 는 후위 (int) 후, 전위 * 에 의해, int 값을 준다. (NOTE: 연산자 우선순위)
type 은 int *( int )

int (*a)( int b);

이름 a 는 전위 * 후, 후위 (int) 에 의해, int 값을 준다. (NOTE: 괄호를 통한 연산자 우선순위 변경)
type 은 int (*)(int)



콤마를 통한 일괄선언
여러개를 동시에 선언할 수 있는데, 그냥 여러줄에 쓸 것을 한줄에 쓴 것에 불과하고, 그 방식은 다음의 예와 같다.

다음의 선언은

int *a( int b), c, d[7], (*e)[3];


다음과 같다

int *a( int b);
int c;
int d[7];
int (*e)[3];




참고: Old Form of Function Definition before ANSI C
아래 그림에서, 
int F1(x,y) int x; int y; { ... } 는 int F1(int x, int y) { ... } 의 old form 으로, Backward Compatibility 를 위해, ANSI C 에서 사용가능하지만, 쓰지 않도록 한다.