コンテンツ
1.構造の宣言
1.1構造の基礎知識
構造体は、メンバー変数と呼ばれる値のコレクションです。構造体の各メンバーは、異なるタイプの変数にすることができます。例:人の場合、名前、年齢、性別などはメンバー変数です
1.2構造の宣言
struct tag //声明一个结构体类型,并不占用空间
{
member-list;
}variable-list;
例:構造体タイプを宣言します-本:
#include <stdio.h>
#include <string.h >
//声明了一个结构体类型 - 书
/*struct Book
{
char name[20];//书名
short price; //定价
}b4,b5,b6;*/ //b4,b5,b6都是结构体变量 - 全局变量(尽量少使用全局变量)
typedef struct Book
{
char name[20];//书名
short price; //定价
}Book; //这里的Book是一种类型,而不是变量
int main()
{
//利用结构体类型创建结构体变量 - 局部变量
struct Book b1; //创建了一本书
struct Book b2;
struct Book b3;
Book b4;
Book b5;
//字符串拷贝
//把"c语言"拷贝到name数组中。因为不能直接用b.name = "c语言"来写
strcpy(b1.name, "c语言");
b1.price = 55;
printf("%s\n", b1.name);
printf("%d\n", b1.price);
return 0;
}
1.3構造体メンバーの種類
構造体のメンバーは、スカラー、配列、ポインター、またはその他の構造体にすることができます
struct B
{
int a;
char c;
};
struct S
{
int a; //标量
char arr[20];//数组
int* p;//指针
struct B sb;//结构体
};
1.4構造変数の定義と初期化
構造タイプで、変数を定義する方法は?
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
2.構造体メンバーへのアクセス
1.演算子(。)構造体変数。メンバー名
2.演算子(->)構造体ポインタ->メンバー名
void print1(struct Stu stu)
{
printf("%s %d\n", stu.name, stu.age);
}
void print2(struct Stu* ps)
{
printf("%s %d\n", (*ps).name, (*ps).age);//正确,但麻烦
printf("%s %d\n", ps->name, ps->age);//结构体指针->成员
}
int main()
{
struct Stu s = { "张三", 20 };
print1(s); //传值调用 stu是s的一份临时拷贝
print2(&s); //传址调用(优于传值调用)
return 0;
}
上記のprint1関数とprint2関数のどちらが優れていますか?回答:print2関数が推奨されます
パラメータを関数に渡すときは、パラメータをスタックにプッシュする必要があります。構造体オブジェクトが渡されると、構造体が大きすぎ、パラメータスタッキングのシステムオーバーヘッドが比較的大きくなるため、パフォーマンスが低下します。
「プッシュスタック」の説明:
すべての関数呼び出しは、メモリ内のスペースに適用する必要があります。アプリケーションはスタックスペース用です。
例えば:
int Add(int c, int d)
{
int z = 0;
z = c + d;
return z;
}
int main()
{
int a = 10;
int b = 20;
int c = Add(a, b);
return 0;
}
システムスタック内:
結論:構造体にパラメーターを渡す場合は、構造体のアドレスを渡す必要があります。