NaaN日記

やったこと、覚えたことを発信する場

構造体(C)

構造体について。

構造体の作成
struct 構造体タグ名{
//データ
}

普通関数よりも先に宣言する

構造体の型の変数を宣言
struct 構造体タグ名 構造体変数名;

C++ではstructをつけなくても宣言できるらしい。

新しく名前をつける
struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
};
typedef struct animals_tag animals;
/* typedef データ型 新しい名前 */
一度に宣言できる
typedef struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
} animals;

新しい型が定義できれば構造体タグ名を省略できる?

typedef struct {
    char animal[64];
    char name[64];
    int old;
    int weight;
} animals;

構造体のポインタを構造体要素に持つときは省略できない
(構造体の宣言が終了していないから?)

構造体変数では要素を名前で区別する
#include <stdio.h>
struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
};

int main(void){
    struct animals_tag data;
    data.old = 5;
    printf("%d歳", data.old);

    return 0;
}
/*5歳*/
文字列を扱うならstrcpy
#include <stdio.h>
#include <string.h>
struct animals_tag {
    char animal[64];
    char name[64];
    int old;
    int weight;
};

int main(void){
    struct animals_tag data;

    strcpy(data.animal, "ねこ");
    printf("%s", data.animal);

    return 0;
}
/*ねこ*/
表示してみる
#include <stdio.h>
#include <string.h>
typedef struct {
    char animal[64];
    char name[64];
    int old;
    int weight;
} animals;
void animals_print(animals data);
int main(void){
    
    animals data;
    strcpy(data.animal,"ねこ");
    strcpy(data.name, "きなこ");
    data.old = 2;
    data.weight = 5;
    
    animals_print(data);
    
    return 0;
}
void animals_print(animals data){
    printf("種類:%s\n", data.animal);
    printf("名前:%s\n", data.name);
    printf("年齢:%d\n", data.old);
    printf("体重:%dkg\n", data.weight);
    return;
}
/*
種類:ねこ
名前:きなこ
年齢:2歳
体重:5kg
*/
構造体の注意

○構造体変数同士での演算、比較はできない
○配列が含まれているとき、中身がコピーされる