typedef | 구조체 | 구조체 포인터
typedef
typedef를 마치 "별명"처럼 사용할 수 있다는 것을 알고 있다.
아래와같이 배열에 대해 typedef를 사용하는 방법도 있으니 알아두자.
#include <stdio.h>
int main() {
typedef int Pair[2];
Pair point = {3, 4}; // int point[2] = {3, 4};
printf("(%d %d)\n", point[0], point[1]);
}
Output
(3 4)
int point[2]를 사용했을때는 아 그냥 두개짜리 배열이구나.. 했던 내용인데
Pair Point라고 선언함으로써 순서쌍을 나타낸다는 것을 직관적으로 알 수 있다.
#include <stdio.h>
int main() {
typedef char *String;
String name = "Dood"; // char *nameA = "Dood";
printf("%s\n", name);
}
Output
Dood
그뿐만 아니라 아래와같이 char *name와 동치인 String을 사용함으로써
문자열을 나타내고자 하는 것을 훨씬 더 명확하게 알 수 있다.
무분별한 typedef의 사용은 가독성을 떨어뜨릴 수 있지만,
위와같이 특정한 자료형에 특별한 의미(e.g., 순서쌍, 문자열 등)가 부여될때 적절하게 사용한다면 유용할 것이다.
구조체
typedef에 대해 이야기한 김에 struct도 간단히 짚고 넘어가자.
struct Point { int x, y; };라고 간단하게 사용하던 내용은 사실 typedef struct { int x, y; } Point;와 동치이다.
만약 struct { int x, y; } Point;라고 사용하는 경우 Point는 자료형이 아니라 하나의 구조체 변수가 되어버리기 때문에 주의해야한다.
구조체 포인터
#include <stdio.h>
struct ProductInfo {
int num;
char name[100];
int cost;
};
int main() {
ProductInfo myProduct = {4797283, "제주 한라봉", 20000};
ProductInfo *ptr_product = &myProduct;
printf("상품 번호 : %d\n", myProduct.num);
printf("상품 이름 : %s\n", (*ptr_product).name);
printf("가 격 : %d\n", ptr_product->cost);
}
ptr_product는 myProduct의 주소값을 가리키는 구조체 포인터이다.
이를 이용하여, 구조체 각각의 멤버에 서로 다른 방법으로 접근해보았다.
*ptr_product.name이라고 접근하게 되면 연산자 우선순위에 따라 *(ptr_product.name)이 되므로 컴파일 에러가 발생한다.
따라서 (*ptr_product).name으로 접근하도록 한다.
이러한 각종 괄호와 별표를 줄여주는 멋진 문법이 있으니 바로 ->이다.
다시말해, (*a).b와 a->b는 동치이다. 졸업하고 보니까 기억이 새록새록하다.
참고 : https://www.inflearn.com/course/c%EC%96%B8%EC%96%B4-%EB%91%90%EB%93%A4%EB%82%99%EC%84%9C/lecture/2810?tab=curriculum