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言語の学習を進めていきましょう