C言語ノート:構造

コンテンツ

1.構造の宣言

1.1構造の基礎知識

1.2構造の宣言

1.3構造体メンバーの種類

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

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


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;
}

システムスタック内:

 

結論:構造体にパラメーターを渡す場合は、構造体のアドレスを渡す必要があります。

おすすめ

転載: blog.csdn.net/m0_62934529/article/details/123553035