目次
現実の世界では、物には多くの属性が関連付けられています。C 言語では、構造化データ型 - 構造体が導入されています。
物に属する複数のデータを整理して、その内部関係を反映します。
1. 構造型の定義
構造体型は複数のメンバーで構成される構築型であり、各メンバーは基本データ型または構築型になります。
構造体タイプの名前は、キーワード struct と構造体の名前で構成されます。
構造定義の一般的な形式は次のとおりです。
struct 構造体の型名
{
型指定子 1 メンバー名 1;
型指定子 2 メンバー名 2;
...
};
struct Stu
{
int age;
int ID;
char name[10];
};
typedef 型の名前変更
知らせ:
- struct は構造体キーワードなので省略できません。構造体の型名は省略可能で、名前なし構造体と呼ばれます。構造体のメンバーには、基本的なデータ型だけでなく、配列型やポインター型も使用できます。
- 構造体の型を定義するステートメントは; で終わる必要があります。 {} の後の ; に注意してください。
- コンパイル時に、システムは定義された構造体型にメモリ領域を割り当てません。
- 構造体の型は変数と同じで、スコープもグローバルとローカルに分かれます。
2. 構造体変数の定義と初期化
struct Point
{
int x;
int y;
}p1;
struct Point p2;
(1) 構造体の型を定義し、次に構造体変数を定義します。
struct Stu
{
int age;
char name[10];
};
int main()
{
//struct 结构体类型的名称 结构体变量名的列表;
struct Stu stu1,stu2;
return 0;
}
(2) 構造体型の定義と同時に構造体変数も定義する
struct 構造体の型名
{
メンバーリスト;
構造体変数名のリスト。
struct Point
{
int x;
int y;
}p1,pn;
(3) 構造体変数を直接定義する
struct
{
int age;
int num;
char sex;
}s1,s2;
初期化ではメンバーの初期化を指定できます
3. 構造体メンバーへのアクセス
1. 構造体変数アクセスメンバー
構造体変数のメンバーには、ドット演算子 ( . ) を使用してアクセスします。ドット演算子は 2 つのオペランドを取ります
#include<stdio.h>
#include<string.h>
struct Stu
{
int age;
char name[10];
};
int main()
{
struct Stu s;
s.age = 18;
strcpy(s.name,"zhangsan");
printf("%s %d",s.name,s.age);
return 0;
}
【結果】張三 18
デバッグからもわかります
2. 構造体ポインタが変数のメンバにアクセスします。
#include<stdio.h>
struct Stu
{
char name[10];
int age;
};
void Print(struct Stu* ps)
{
printf("name = %s age = %d\n",(*ps).name,(*ps).age);
printf("name = %s age = %d\n",ps->name,ps->age);
}
int main()
{
struct Stu s = {"zhangsan",18};
Print(&s);
return 0;
}
メンバーを印刷するだけの場合、アドレスを渡すことはできません
(アドレスを渡す方が動作効率が良いので推奨します)
4. 構造体パラメータの受け渡し
#include<stdio.h>
struct S
{
int data[100];
int num;
};
struct S s = { {1,2,3},100 };
//结构体传参
void print1(struct S s)
{
printf("%d\n",s.num);
}
//结构体地址传参
void print2(struct S *ps)
{
printf("%d\n",ps->num);
}
int main()
{
print1(s);
print2(&s);
return 0;
}
【結果】100 100
上記のコードによると、print2関数の方が優れています
関数がパラメータを渡すとき、パラメータをスタックにプッシュする必要があるため
構造体オブジェクトを渡すと構造体が大きすぎ、パラメータの積み重ねによるシステムのオーバーヘッドが相対的に大きくなるため、パフォーマンスの低下につながります
構造体をパラメータとして渡す場合は、構造体のアドレスを渡す必要があります。