타입 선언시 연산자가 복잡해지면 의미를 해석하기가 쉽지 않다.
해석 할때 기본적인 룰은 아래와 같다.
- 역참조 연산자 *의 의미는 다음과 같다.
- 지금까지 읽은 것은 타입의 주소
- 앞으로 읽은 것은 그 주소가 가리키는 대상의 타입
- 배열 연산자 [] 의 의미는 다음과 같다.
- 지금까지 읽은 것은 배열
- 앞으로 읽은 것은 배열의 원소 하나의 타입
- 함수 연산자()의 의미는 다음과 같다.
- 지금까지 읽은 것은 함수
- 앞으로 읽은 것은 함수의 리턴 타입
여기서 주의 해야 할것이 있는데, 해석시 연산자의 해석 순위이다.
() [] . -> (가장 높음)
단항 연산자
* / %
+ -
크기 비교
논리 연산 ! && ||
대입 (가장 낮음)
타입 선언 읽기의 예 #1
char * (*a) [10]
1) 이름은 a
2) a의 타입은 주소
3) 그 주소가 가르키는 것은 배열
4) 배열의 원소는 주소
5) 배열의 원소인 주소가 가르키는 것은 char
예제)
void main(void)
{
char *(*a)[3];
char *b[3];
b[0] = "apple";
b[1] = "banana";
b[2] = "orange";
a = &b;
for (int i = 0; i < 3; i++)
{
printf_s("%s\r\n", b[i]);
printf_s("%s\r\n", (*a)[i]);
}
}
apple, banana, orange가 차례로 찍힌다.
타입 선언 읽기의 예 #2
int (* b[5])(int);
1) 이름은 b
2) b의 타입은 배열
3) 배열의 원소는 주소이다.
4) 배열의 원소인 주소가 가르키는 것은 함수다.
5) 함수의 리턴 타입은 int
타입 선언 읽기의 예 #3
char (* encrypt (char (*)[10]))[10];
1) 이름은 encrypt
2) encrypt는 함수
3) 함수의 리턴 타입은 주소
4) 그 주소가 가르키는것은 배열
5) 배열의 원소는 char