一次構造(超詳しく解説)

1. 構造の宣言

ここに画像の説明を挿入

1.1 構造の基礎知識

構造体とは、メンバー変数と呼ばれるの集合です。構造体の各メンバーは、異なる型の変数にすることができます。構造体 - -> (構造体)の比較:

ここに画像の説明を挿入

1.2 構造体の宣言

ここに画像の説明を挿入

struct Stu
{
    
    
	//学生相关属性
	char name[20];
	int age;
	char sex[5];
	char id[20];
}s3,s4;//不可省略;
//s3,s4是结构体变量类型
//s3,s4是全局的
int main()
{
    
    
	struct Stu s1;
	struct Stu s2;
	//s1,s2是结构体类型的变量,是局部的
	struct Stu s3;
	return 0;
}

structには型定義が必須です
以下の定義を見てみましょう: (structは省略可能)

typedef struct Stu
{
    
    
	//学生相关属性
	char name[20];
	int age;
	char sex[5];
	char id[20];
}Stu;//Stu是重新定义的新类型
int main()
{
    
    
	struct Stu s1;
	struct Stu s2;
	//s1,s2是结构体类型的变量,是局部的
	Stu s5;//typedef定义下可省略struct
	return 0;
}

1.3 構造体メンバの種類

構造体変数のメンバーには、スカラー、配列、ポインター、またはその他の構造体を使用できます。

struct B
{
    
    
	char c;
	int i;
};

struct S
{
    
    
	char c;
	int num;
	int arr[10];
	double* pd;
	struct B sb;
	struct B* pb;
};
int main()
{
    
    
	return 0;
}

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

構造体型を使用すると、変数を定義する方法は実際には非常に簡単です。

struct B
{
    
    
	char c;
	int i;
};
struct S
{
    
    
	char c;
	int num;
	int arr[10];
	double* pd;
	struct B sb;
	struct B* pb;
}s1;//s1是全局变量
struct S s2;//s2是全局变量
int main()
{
    
    
	double d = 3.14;
	//按照顺序初始化
	struct S s3 = {
    
     'q', 100, {
    
    1,2,3}, &d, {
    
    'a', 99}, NULL };//局部变量
	//指定成员来初始化
	struct S s4 = {
    
     .num = 1000, .arr = {
    
    1,2,3,4,5} };//局部变量
	return 0;
}

2. 構造へのアクセス

  • 構造体変数のメンバーへのアクセス
    構造体変数のメンバーには、ドット演算子 (.) を介してアクセスします。ドット演算子は 2 つのオペランドを受け入れます。
  • 変数のメンバーへの構造体ポインター アクセス
    取得するのが構造体変数ではなく、構造体へのポインターである場合があります。(->) で 1 にアクセスします

ケース 1:

#include <string.h>

struct S
{
    
    
	char name[20];
	int age;
};
void set_s(struct S t)
{
    
    
	t.age = 18;
	//t.name = "zhangsan";//err, 因为name是数组名,数组名是常量的地址
	strcpy(t.name, "zhangsan");//字符串拷贝
}
int main()
{
    
    
	struct S s = {
    
     0 };
	//写一个函数给s中存放数据
	set_s(s);
	return 0;
}

上記の間違ったコード
ここに画像の説明を挿入

次のように変更します。

//void set_s(struct S* ps)
//{
    
    
//	(*ps).age = 18;
//	//t.name = "zhangsan";//err, 因为name是数组名,数组名是常量的地址
//	strcpy((*ps).name, "zhangsan");//字符串拷贝
//}

//
void set_s(struct S* ps)
{
    
    
	ps->age = 18;
	//t.name = "zhangsan";//err, 因为name是数组名,数组名是常量的地址
	strcpy(ps->name, "zhangsan");//字符串拷贝
}

void print_s(struct S* ps)
{
    
    
	printf("%s %d\n", ps->name, ps->age);
}

int main()
{
    
    
	struct S s = {
    
    0};
	//写一个函数给s中存放数据
	set_s(&s);

	//写一个函数打印s中的数据
	print_s(&s);

	return 0;
}

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

コードに直接移動します。

struct S
{
    
    
	char name[20];
	int age;
};
void set_s(struct S* ps)
{
    
    
	ps->age = 18;
	//t.name = "zhangsan";//err, 因为name是数组名,数组名是常量的地址
	strcpy(ps->name, "zhangsan");//字符串拷贝
}

void print1(struct S ps)
{
    
    
	printf("%s %d\n", ps.name, ps.age);
}
int main()
{
    
    
	struct S s = {
    
     0 };
	//写一个函数给s中存放数据
	set_s(&s);

	//写一个函数打印s中的数据
	print1(s);

	return 0;
}
//
//
struct S
{
    
    
	char name[20];
	int age;
};
void set_s(struct S* ps)
{
    
    
	ps->age = 18;
	//t.name = "zhangsan";//err, 因为name是数组名,数组名是常量的地址
	strcpy(ps->name, "zhangsan");//字符串拷贝
}

void print2(struct S* ps)
{
    
    
	printf("%s %d\n", ps->name, ps->age);
}
int main()
{
    
    
	struct S s = {
    
    0};
	//写一个函数给s中存放数据
	set_s(&s);

	//写一个函数打印s中的数据
	print2(&s);

	return 0;
}

答えは、print2 関数の方が望ましいということです。
理由:

構造体オブジェクトを使用する場合、構造体が大きすぎるため、パラメータをスタックにプッシュするシステムのオーバーヘッドが比較的大きくなり、パフォーマンスの低下につながります。

結論は:

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

知らず知らずのうちに、この構造は終わりを迎え始めていました。全文を読んで得るものも多かったのではないでしょうか。これからも一緒にC言語の学習を進めていきましょう

おすすめ

転載: blog.csdn.net/2201_75642960/article/details/132055806