【C言語】構造詳細説明

目次

1. 構造型の定義

 2. 構造体変数の定義と初期化

3. 構造体メンバーへのアクセス

1. 構造体変数アクセスメンバー

2. 構造体ポインタが変数のメンバにアクセスします。 

4. 構造体パラメータの受け渡し


現実の世界では、物には多くの属性が関連付けられています。C 言語では、構造化データ型 - 構造体が導入されています。

物に属する複数のデータを整理して、その内部関係を反映します。

1. 構造型の定義

構造体型は複数のメンバーで構成される構築型であり、各メンバーは基本データ型または構築型になります。

構造体タイプの名前は、キーワード struct と構造体の名前で構成されます。

構造定義の一般的な形式は次のとおりです。

struct 構造体の型名

{

        型指定子 1 メンバー名 1;

        型指定子 2 メンバー名 2;

        ...

};

struct Stu 
{
	int age;
	int ID;
	char name[10];
};

typedef 型の名前変更

知らせ:

  1. struct は構造体キーワードなので省略できません。構造体の型名は省略可能で、名前なし構造体と呼ばれます。構造体のメンバーには、基本的なデータ型だけでなく、配列型やポインター型も使用できます。
  2. 構造体の型を定義するステートメントは; で終わる必要があります。  {} の後の ; に注意してください。
  3. コンパイル時に、システムは定義された構造体型にメモリ領域を割り当てません。
  4. 構造体の型は変数と同じで、スコープもグローバルとローカルに分かれます。

 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関数の方が優れています

関数がパラメータを渡すとき、パラメータをスタックにプッシュする必要があるため

構造体オブジェクトを渡すと構造体が大きすぎ、パラメータの積み重ねによるシステムのオーバーヘッドが相対的に大きくなるため、パフォーマンスの低下につながります

構造体をパラメータとして渡す場合は、構造体のアドレスを渡す必要があります。 

おすすめ

転載: blog.csdn.net/qq_72505850/article/details/132207842