構造体 (struct) は C 言語の重要なデータ型であり、異なる型のメンバーのセットで構成されます。構造体を使用すると、学生の情報、従業員の記録、四角形の寸法などの複雑なデータ構造を表すことができます。
構造体を定義した後、構造体変数を宣言できます。各構造体変数には、構造体型のすべてのメンバーが含まれます。構造体変数の各メンバーは、int、float、char などの異なるデータ型にすることができます。
構造体では、各メンバーには独自の名前とデータ型があり、構造体のメモリ レイアウトを記述します。ドット演算子 (.) または矢印演算子 (->) を使用して構造体のメンバーにアクセスできます。
構造体はネストすることもできます。つまり、1 つの構造体に別の構造体タイプのメンバーを含めることができます。このネストを使用して、より複雑なデータ構造を表すことができます。
1. 構造の定義と使用
C++ では、構造体は、さまざまな型のデータ メンバーを含めることができるユーザー定義のデータ型です。構造体の定義と使用は C 言語の構造体と似ていますが、C++ には追加の関数と機能がいくつかあります。
サンプルコード:
#include <iostream>
// 定义一个结构体
struct Person {
std::string name;
int age;
std::string address;
};
int main() {
// 创建一个结构体变量并初始化
Person person1 = {
"Alice", 25, "123 Main St."};
// 访问结构体的成员
std::cout << "Name: " << person1.name << std::endl;
std::cout << "Age: " << person1.age << std::endl;
std::cout << "Address: " << person1.address << std::endl;
// 修改结构体成员的值
person1.age = 30;
std::cout << "Updated Age: " << person1.age << std::endl;
return 0;
}
コードの説明:
上の例では、まずキーワードを使用して名前を付けた構造struct
体を定義しPerson
、その中に と の 3 つのデータ メンバーを定義name
しage
ますaddress
。次に、main()
関数内で という型の構造体変数を作成し、person1
初期Person
化子リストを使用してそのメンバーを初期化します。次に、.
演算子を使用して構造体のメンバーにアクセスし、その値を出力します。最後に、メンバーperson1
の値を変更し、新しい値を再度出力します。age
2. 構造体配列
構造体配列は、複数の構造体を含むデータ構造体です。構造体の型を定義し、その型を使用することで、配列を宣言および初期化できます。構造体の配列は、同じ構造を持つデータ項目を格納するためによく使用されます。
サンプルコード:
#include <stdio.h>
// 定义一个结构体类型
struct Person {
char name[50];
int age;
};
int main() {
// 声明并初始化一个结构体数组
struct Person people[3] = {
{
"Alice", 25},
{
"Bob", 30},
{
"Charlie", 35}
};
// 访问结构体数组的成员
for (int i = 0; i < 3; i++) {
printf("Person %d: %s, %d\n", i+1, people[i].name, people[i].age);
}
return 0;
}
コードの説明:
上記のコードでは、まず、Person
文字配列name
と整数を含む という名前の構造体タイプを定義しますage
。次に、main()
関数内でPerson
3 つの構造体の配列を宣言して初期化しますpeople
。次に、for
ループを使用して構造体の配列を反復処理し、.
演算子を使用して各構造体のメンバーにアクセスします。最後に各構造体のメンバー値を出力します。
3. 構造体ポインタ
構造体ポインタは、構造体変数のアドレスを格納するために使用されるポインタ型です。構造体ポインターを介して、構造体のメンバーに間接的にアクセスして変更できます。
サンプルコード:
#include <stdio.h>
// 定义一个结构体类型
struct Point {
int x;
int y;
};
int main() {
// 声明一个结构体变量
struct Point p1 = {
10, 20 };
// 声明一个指向结构体的指针
struct Point *p2 = &p1;
// 通过指针访问结构体的成员
printf("p2->x: %d\n", p2->x);
printf("p2->y: %d\n", p2->y);
// 通过指针修改结构体的成员
p2->x = 30;
p2->y = 40;
printf("p1->x: %d\n", p1.x);
printf("p1->y: %d\n", p1.y);
return 0;
}
コードの説明:
上記のコードでは、最初に2 つの整数メンバーと をPoint
含む という構造体タイプを定義します。次に、関数内でtype の構造体変数を宣言し、そのメンバーを初期化します。次に、型へのポインターを宣言し、それにアドレスを割り当てます。x
y
main()
Point
p1
Point
p2
p1
ポインターを介して、演算子を使用して構造体のメンバーにアクセスp2
できます。->
たとえば、構造体変数のメンバーp2->x
にアクセスします。同時に、ポインターを使用して構造体のメンバーを変更することもできます。たとえば、30 に変更します。これはのアドレスを指しているため、 への変更は の値にも影響します。最後に、変更された合計値を出力します。p1
x
p2->x
p2
p1
p2->x
p1.x
p1.x
p1.y
4. 構造のネスト
構造のネストとは、ある構造を別の構造内にネストすることを指し、通常は複雑なデータ構造を構築するために使用されます。C 言語では、入れ子構造を定義することでこれを実現できます。
サンプルコード:
#include <stdio.h>
// 定义一个结构体类型
struct Person {
char name[50];
int age;
};
// 定义一个嵌套的结构体类型
struct Student {
struct Person person; // 嵌套一个Person结构体
int grade;
};
int main() {
// 声明并初始化一个Student结构体变量
struct Student student = {
{
"Alice", 20},
90
};
// 访问Student结构体的成员
printf("Name: %s\n", student.person.name);
printf("Age: %d\n", student.person.age);
printf("Grade: %d\n", student.grade);
return 0;
}
コードの説明:
上記のコードでは、まず、文字配列と整数Person
を含む という名前の構造体タイプを定義します。次に、typeと integerのメンバー変数を含む というネストされた構造型を定義します。関数内で、型の構造体変数を宣言して初期化します。ドット演算子を使用すると、やなどのメンバーにアクセスできます。出力には と が表示されます。name
age
Student
Person
person
grade
main()
Student
student
student
student.person.name
student.person.age
student.grade
Alice
20
90
5. 構造体を関数パラメータとして使用する
構造体を関数のパラメータとして使用して構造体変数の値を渡すことができるため、関数内で構造体変数を操作できます。これにより、データを全体として渡すことができ、複数の個別の変数を渡す手間が省けます。
サンプルコード:
#include <stdio.h>
// 定义一个结构体类型
struct Point {
int x;
int y;
};
// 定义一个函数,接受一个Point类型的结构体作为参数
void printPoint(struct Point p) {
printf("x: %d, y: %d\n", p.x, p.y);
}
int main() {
// 声明并初始化一个Point类型的结构体变量
struct Point p = {
10, 20 };
// 调用函数,将结构体变量作为参数传递
printPoint(p);
return 0;
}
コードの説明:
上記のコードでは、最初に2 つの整数メンバーと をPoint
含む という構造体タイプを定義します。次に、引数として struct 型を受け取る という関数を定義します。関数内で、 type の構造体変数を宣言して初期化し、それをパラメーターとして関数に渡します。関数内では、構造体変数のメンバーを使用して結果を出力できます。x
y
printPoint
Point
main()
Point
p
printPoint
p
6. 構造体での const の使用
構造体では、const キーワードを使用してメンバー変数またはメンバー関数を変更し、構造体内の値や動作が変更されないようにできます。
- const メンバー変数:
struct MyStruct {
const int myConstVar;
};
上記のコードでは、myConstVar
は const メンバー変数であり、構造体の作成時に初期化され、その値は変更できません。const メンバー変数の初期化は、構造体宣言の初期化リストで実行する必要があります。
- const メンバー関数:
struct MyStruct {
int myVar;
void myConstFunc() const {
// 这个成员函数不能修改myVar的值
}
};
上記のコードでは、myConstFunc()
これは const メンバー関数であり、構造体のメンバー変数の値を変更できません。これは、関数宣言の最後に const キーワードを追加することで実現できます。
- const ポインタ メンバー:
struct MyStruct {
int myVar;
const int* myConstPtr;
};
上記のコードでは、myConstPtr
は const 整数を指す const ポインター メンバーです。このポインタが指す値は変更できません。指す値を変更する必要がある場合は、非 const ポインターを使用するか、他のメソッドを通じて変更した値を構造体に渡す必要があります。