C言語のtypedef

1763 ワード

typedefは、行のデータ型は導入されず、データ型に別名を作成します.
本を読むとき、次のようなカスタムデータ型に遭遇しました.
typedef struct {
    int data_a;
}St[MAXSIZE];

変数を定義するとき、どうなりますか?関数パラメータを渡す場合、データは値で渡されますか?それともポインタだけが渡されますか?ちょっと戸惑いましたが、配列と似ていると思います.そこでセグメントコードを書き、このカスタムタイプと配列を一緒にテストします.(試験環境Ubuntu 14.04 64ビット)
/*   typedef */

#include <stdio.h>

#define MAXSIZE 5   

typedef struct {
    int data_a;
}St[MAXSIZE];           /*         */

/*   ss is     */
void Output(St ss, int is[])
{
    int i;

    for (i = 0; i < MAXSIZE; i++) {
        printf("%d  %d
", ss[i].data_a, is[i]);     }        printf("
"); } /*  ss is  */ void Change(St ss, int is[]) {     int     i;       printf("sizeof(ss) = %lu, sizeof(is) = %lu 
",              sizeof(ss), sizeof(is));     for (i = 0; i < MAXSIZE; i++) {         ++ss[i].data_a;         ++is[i];     }    } int main(void) {     int i;     St  ss;                     //      int is[MAXSIZE];            // int     printf("sizeof(s) = %lu
", sizeof(ss));     printf("sizeof(is) = %lu
", sizeof(is));     /*  s */     for (i = 0; i < MAXSIZE; i++) {         ss[i].data_a = i;         is[i] = i;     }        Output(ss, is);     //  ss     Change(ss, is);     //  ss     Output(ss, is);     //  ss     return 0;    }

コンパイル後に実行:
$ ./01
sizeof(ss) = 20          //        St
sizeof(is) = 20          // int  
0  0
1  1
2  2
3  3
4  4

sizeof(ss) = 8, sizeof(is) = 8           // St int         (     64  )
1  1
2  2
3  3
4  4
5  5

やはり配列と同じです.
Stタイプのデータを定義する場合、sizeofを使用して20 Byte(5*sizeof(int))のデータサイズを計算します(構造配列が定義されています).パラメータを渡す場合、ポインタが渡されます.このStタイプは配列の動作原理にそっくりです.