[C言語]構造体をtypedefして新しい型を定義する

構造体を新たな型として宣言する

#include <stdio.h>

typedef struct _TAG_POINT {
    int x;
    int y;
} POINT, *LPPOINT;

main() {
    POINT p;
    p.x = 1;
    p.y = 2;
    
    printf("p  = {%d, %d}\n", p.x, p.y);
    
    LPPOINT lp;
    lp->x = 3;
    lp->y = 4;
    
    printf("lp = {%d, %d}\n", lp->x, lp->y);
}
実行結果
p  = {1, 2}
lp = {3, 4}


構造体にポインタを割り当てると、PerlやPHPのオブジェクトと似た感じになりますね。
アロー演算子(->)でメンバにアクセスするところが同じです。

はまりどころ

typedefでポインタを型定義してしまった場合、変数宣言でポインタかポインタでないかが分からなくなります。

例えばint型の場合、
int i;
int *pi;
のようにポインタ変数の宣言で*がつくので見分けやすいです。
一方、構造体を指すポインタをtypedefした場合は、
POINT p;
LPPOINT lp;
のようにひじょ~~に見分けづらくなります。
接頭辞LPをつけるなどの工夫がいりそうです。
余談
ポインタにlpという接頭辞をつけるのは、C言語界隈での昔からの慣習のようです。
(もとの由来はlong pointerだったとかかんとか)
カテゴリ:

人気記事