C言語コミュニティ学習(1回の学習)

C言語コミュニティ学習

Union は C 言語の特殊なデータ型で、異なるデータ型を同じメモリ空間に格納できますが、一度に使用できるデータ型は 1 つだけです。共用体を定義する方法は、キーワードが「struct」ではなく「union」であることを除いて、構造体の定義と似ています。
共用体の定義形式は以下のとおりです。

union union_name {
    type1 member1;
    type2 member2;
    ...
    typen membern;
};

このうち、union_name は共用体の名前、member1、member2、...、member は共用体のメンバーです。
共用体のサイズは、すべてのメンバーの中で最大のメンバーのサイズになります。すべてのメンバーは同じメモリ空間を共有するため、共用体の異なるメンバーの値は相互に影響を与える可能性があります。
共用体の使用方法は構造体の使用方法と似ていますが、共用体のメンバーへの代入は、同じメモリ空間を共有するため、共用体の他のメンバーに影響を与えることに注意してください。
ユニオンには幅広いアプリケーション シナリオがあり、メモリ領域を節約するために使用したり、型変換などの演算にも使用したりできます。

メンバーのシンボルにアクセスします。

共用体のメンバーにアクセスするには、ドット演算子 (.) または矢印演算子 (->) を使用して共用体のメンバーにアクセスします。ドット演算子は共用体変数のメンバーにアクセスするために使用され、アロー演算子は共用体へのポインターのメンバーにアクセスするために使用されます。
サンプルコードは次のとおりです。

#include <stdio.h>

union myUnion {
    int num;
    char letter;
};

int main() {
    union myUnion u;
    u.num = 65;
    printf("Num value: %d\\n", u.num);
    printf("Letter value: %c\\n", u.letter);
    u.letter = 'B';
    printf("Num value: %d\\n", u.num);
    printf("Letter value: %c\\n", u.letter);
    return 0;
}

上記のコードは、整数メンバー num と文字メンバー Letter を含む共用体 myUnion を作成します。main 関数では、最初に num メンバーに値 65 を割り当て、次にドット演算子を使用して num メンバーと Letter メンバーの値を出力します。次に、letter メンバーの値を文字 'B' に割り当てます。これは、同じメモリ空間を共有するため、num メンバーの値に影響します。最後に、ドット演算子を再度使用して、num メンバーと Letter メンバーの値を出力します。

ユニオン変数のメンバーには、ドット演算子 (.) を使用してアクセスできます。次に例を示します。

union myUnion {
    int num;
    char letter;
};

int main() {
    union myUnion u;
    u.num = 65;
    printf("Num value: %d\\n", u.num);
    printf("Letter value: %c\\n", u.letter); // 使用点运算符访问letter成员
    return 0;
}

上記のコードでは、整数メンバー num と文字メンバー Letter を含む共用体 myUnion を定義します。main 関数では、最初に num メンバーに値 65 を割り当て、次にドット演算子を使用して num メンバーとcharacter メンバーの値 ( や など) を出力しu.numますu.letter

ソフトウェア プログラミングにおける共用体の実際の応用例を次に示します。

#include <stdio.h>

union myUnion {
    int num;
    char letter;
};

int main() {
    union myUnion u;
    u.num = 65;
    printf("Num value: %d\\\\n", u.num);
    printf("Letter value: %c\\\\n", u.letter);
    u.letter = 'B';
    printf("Num value: %d\\\\n", u.num);
    printf("Letter value: %c\\\\n", u.letter);
    return 0;
}

上記のコードは、整数メンバー num と文字メンバー Letter を含む共用体 myUnion を作成します。main 関数では、最初に num メンバーに値 65 を割り当て、次にドット演算子を使用して num メンバーと Letter メンバーの値を出力します。次に、letter メンバーの値を文字 'B' に割り当てます。これは、同じメモリ空間を共有するため、num メンバーの値に影響します。最後に、ドット演算子を再度使用して、num メンバーと Letter メンバーの値を出力します。

共用体は組み込みプログラミングで広く使用されています。たとえば、共用体を使用してハードウェア レジスタのビットフィールドを操作できます。通常、ハードウェア レジスタには複数のビット フィールドが含まれており、それぞれが異なる状態または制御を表します。共用体を使用すると、各ビット フィールドに簡単にアクセスして設定できます。

以下に、共用体を使用してハードウェア レジスタのビット フィールドにアクセスするコード例を示します。

#include <stdio.h>

typedef union {
    unsigned char reg;
    struct {
        unsigned char bit0 : 1;
        unsigned char bit1 : 1;
        unsigned char bit2 : 1;
        unsigned char bit3 : 1;
        unsigned char bit4 : 1;
        unsigned char bit5 : 1;
        unsigned char bit6 : 1;
        unsigned char bit7 : 1;
    } bits;
} Register;

int main() {
    Register r;
    r.reg = 0x0A;
    printf("Bit 0: %d\\n", r.bits.bit0);
    printf("Bit 1: %d\\n", r.bits.bit1);
    printf("Bit 2: %d\\n", r.bits.bit2);
    printf("Bit 3: %d\\n", r.bits.bit3);
    printf("Bit 4: %d\\n", r.bits.bit4);
    printf("Bit 5: %d\\n", r.bits.bit5);
    printf("Bit 6: %d\\n", r.bits.bit6);
    printf("Bit 7: %d\\n", r.bits.bit7);
    return 0;
}

上記のコードでは、符号なし文字メンバー reg とビット フィールド構造 bits を含む共用体 Register を定義します。ビット フィールド構造には 8 ビット フィールドが含まれており、各ビット フィールドは reg 内のビットを表します。ビットフィールド構造を使用すると、各ビットに簡単にアクセスして設定できます。

main 関数では、まず reg メンバーを 0x0A に割り当て、次にドット演算子とビット フィールド名を使用して各ビットの値を出力します。

共用体を使用してハードウェア レジスタを処理する場合は、共用体のサイズがハードウェア レジスタのサイズと同じであること、およびビット フィールドの順序とサイズがハードウェアのサイズと同じであることを確認する必要があることに注意してください。登録。そうしないと、未定義の動作や誤った結果が発生する可能性があります。

おすすめ

転載: blog.csdn.net/weixin_51624736/article/details/129493341