1. ホーム
  2. C language

struct と typedef struct を徹底的に理解する

2022-02-09 18:53:08
<パス

//第1章 転載 ==========================================================================================================================
struct と typedef struct は徹底的に理解されている
転載先 https://www.cnblogs.com/qyaizs/articles/2039101.html
struct と typedef struct

これは3つに分けて語られる。
  1 はじめに // CとC++の違いに注意
    C言語では、typedefで構造体型を定義します。

    typedef struct Student
    {
    int a;
    }Stu;

    だから、変数を宣言するときに、できる。Stu stu1; (typedefがない場合はstruct Student stu1;で宣言する必要があります)
    ここでStuはstruct Studentの別名です。stu==struct Student
    また、ここではStudentを省略することができます(つまり、Student stu1;を構造化することはできず、Stu stu1;とする必要があります)。
    typedef struct
    {
    int a;
    }スチュ
    しかし、c++では単純に、直接
    構造体Student
    {
    int a;
    };    
    ** そして、Studentという構造体が定義され、Student stu2という変数が直接宣言されています。
======================================================================================**

  2. 第二に
    c++ではtypedefが使用されている場合、それは再びの違いを作る。

typedef struct 

    を使用すると、stu1.a に直接アクセスすることができます。
    しかし、stu2 の場合は、まず stu2 s2 が必要です。
    **then s2.a=10;
======================================================================================**

  3 上の2つをマスターすれば十分なのですが、最後にあまり重要でない問題を探ります
    cプログラムで、次のように書くとします。

    { 

    これは何としてカウントされるのでしょうか?
    コンパイラ(VC6)を観察しての個人的な理解では、これは以下のものと同等だと思います。
    typedef struct
    {
    int numです。
    int ageを指定します。
    }aaa.
    typedef aaa bbb;
    typedef aaa ccc; 
    これは、aaa, bbb, cccがすべてstruct型であることを意味します。変数を宣言するときには、どれを使ってもいいわけで、これはC++でも同じです。しかし、c++でtypedefキーワードを書き飛ばすと、aaa, bbb, cccは3つの全く異なるオブジェクトになることに注意する必要があります。

    // ここではあまり理解されていません。

typedef structとstructの違い。

    int a; 

    上のタグMyStructが識別子、MyStructが変数の型((int,char,など)に相当)です。

    この文は、実際には2つの操作を実現している。

      1) 新しい構造体型を定義する

    }Stu; 

  解析:tagMyStructは"tag"と呼ばれていますが、実はこれは仮の名前で、typedefstructキーワードとtagMyStructを合わせて構造体の型を構成してもしなくても、構造体は存在するのです。

  struct tagMyStruct varName を使って変数を定義することができますが、struct と tagMyStruct を合わせて struct 型を表すので、tagMyStruct varName を使って変数を定義するのは正しくないことに注意しましょう。

  2) typedef は、この新しい構造体に MyStruct という名前をつけます。

    typedef struct tagMyStruct MyStruct;

  つまり、MyStructは実際にはstruct tagMyStructと同等であり、MyStruct varNameを使って変数を定義することができるのです。

  2.

    But in c++ it's as simple as directly 

    C言語では、このアサーションの後に構造体変数を要求する方法が2つあります。

    (1) struct tagMyStruct 変数名

    (2) MyStruct変数名

    c++では、以下のようになります。

    (1) struct tagMyStruct 変数名

    (2) MyStruct変数名

    (3) tagMyStruct変数名

// 第2章 オリジナル ==================================================================================================================================
typedef は構造体ポインタの新しい型を定義し、この新しい型を使って、そのような構造体を指す構造体ポインタ変数を定義しますが、その正しい定義方法については、後述します。
問題の原因:i2c_controller.c で、2440 の i2c コントローラを登録する際、 register_i2c_controller(p_i2c_controller *p) で、フォームパラメータを p_i2c_controller p にできないのか、 p_i2c_controller controller はポインタとして定義されていますよね?

登録された2つの関数を見ると

    struct Student 

    { 

VC++ 6.0での構造体ポインタの実行結果について。

    int a; 
    };