構造物
構造物(構造体とも呼ばれます)は、関連する複数の変数を 1 か所にグループ化する方法です。 構造体の各変数は、構造体のメンバーとして知られます。
配列とは異なり、構造体にはさまざまなデータ型 (int、float、char など) を含めることができます。
構造を作成する
struct
キーワードを使用して構造体を作成し、その各メンバーを中括弧内で宣言できます。
struct MyStructure { // Structure declaration
int myNum; // Member (int variable)
char myLetter; // Member (char variable)
}; // End the structure with a semicolon
構造体にアクセスするには、その構造体の変数を作成する必要があります。
main()
メソッド内で struct
キーワードを使用し、続いて構造体の名前、構造体変数の名前を続けます。
「s1」という名前の構造体変数を作成します。
struct myStructure {
int myNum;
char myLetter;
};
int main() {
<strong> struct myStructure s1;</strong>
return 0;
}
構造体メンバーへのアクセスする
構造体のメンバーにアクセスするには、ドット構文 (.
)を利用します。
例
// Create a structure called myStructure
struct myStructure {
int myNum;
char myLetter;
};
int main() {
// Create a structure variable of myStructure called <strong>s1</strong>
struct myStructure s1;
// Assign values to members of s1
s1.myNum = 13;
s1.myLetter = 'B';
// Print values
printf("My number: %d\n", s1.myNum);
printf("My letter: %c\n", s1.myLetter);
return 0;
}
自分で試してみる»
1 つの構造体だけを使用して、異なる値を持つ複数の構造体変数を簡単に作成できるようになりました。
例
// Create different struct variables
struct myStructure s1;
struct myStructure s2;
// Assign values to different struct variables
s1.myNum = 13;
s1.myLetter = 'B';
s2.myNum = 20;
s2.myLetter = 'C';
自分で試してみる»
構造体の文字列はどうなるでしょうか?
C の文字列は実際には文字の配列であることに注意してください。残念ながら、次のように配列に値を代入することはできません。
例
struct myStructure {
int myNum;
char myLetter;
char myString[30]; // String
};
int main() {
struct myStructure s1;
// Trying to assign a value to the string
s1.myString = "Some text";
// Trying to print the value
printf("My string: %s", s1.myString);
return 0;
}
エラーが発生します:
prog.c:12:15: error: assignment to expression with array type
自分で試してみる»
ただし、これには解決策があります。 次のように strcpy()
関数を使用して、値を s1.myString
に割り当てることができます。
例
struct myStructure {
int myNum;
char myLetter;
char myString[30]; // String
};
int main() {
struct myStructure s1;
// Assign a value to the string using the strcpy function
strcpy(s1.myString, "Some text");
// Print the value
printf("My string: %s", s1.myString);
return 0;
}
結果:
My string: Some text
自分で試してみる»
より単純な構文
宣言時に 1 行で構造体変数のメンバーに値を割り当てることもできます。
中括弧 {} 内のカンマ区切りリストに値を挿入するだけです。 この手法では、文字列値に strcpy()
関数を使用する必要がないことに注意してください。
例
// Create a structure
struct myStructure {
int myNum;
char myLetter;
char myString[30];
};
int main() {
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Print values
printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);
return 0;
}
自分で試してみる»
注: 挿入される値の順序は、構造体で宣言された変数の型の順序と一致する必要があります (int の場合は 13、char の場合は「B」など)。
構造のコピー
ある構造を別の構造に割り当てることもできます。
次の例では、s1 の値が s2 にコピーされます。
例
struct myStructure s1 = {13, 'B', "Some text"};
struct myStructure s2;
<strong>s2 = s1;</strong>
自分で試してみる»
値を変更する
値を変更/修正したい場合は、ドット構文 (.
)を使用できます。
また、文字列値を変更するには、 strcpy()
関数が便利です。
例
struct myStructure {
int myNum;
char myLetter;
char myString[30];
};
int main() {
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Modify values
s1.myNum = 30;
s1.myLetter = 'C';
strcpy(s1.myString, "Something else");
// Print values
printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);
return 0;
}
自分で試してみる»
値の変更は、構造体の値をコピーするときに特に役立ちます。
例
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Create another structure variable
struct myStructure s2;
// Copy s1 values to s2
s2 = s1;
// Change s2 values
s2.myNum = 30;
s2.myLetter = 'C';
strcpy(s2.myString, "Something else");
// Print values
printf("%d %c %s\n", s1.myNum, s1.myLetter, s1.myString);
printf("%d %c %s\n", s2.myNum, s2.myLetter, s2.myString);
自分で試してみる»
では、構造はどのように役立つのでしょうか? ブランド、モデル、年式など、車に関するさまざまな情報を保存するプログラムを作成する必要があると想像してください。 構造の優れた点は、単一の「車のテンプレート」を作成し、作成するすべての車にそれを使用できることです。 実際の例については、以下を参照してください。
実際の例
構造体を使用して、車に関するさまざまな情報を保存します。
例
struct Car {
char brand[50];
char model[50];
int year;
};
int main() {
struct Car car1 = {"BMW", "X5", 1999};
struct Car car2 = {"Ford", "Mustang", 1969};
struct Car car3 = {"Toyota", "Corolla", 2011};
printf("%s %s %d\n", car1.brand, car1.model, car1.year);
printf("%s %s %d\n", car2.brand, car2.model, car2.year);
printf("%s %s %d\n", car3.brand, car3.model, car3.year);
return 0;
}
自分で試してみる»