4

typdefこれのパーツと、各パーツの機能と使用方法を特定するのを手伝ってください。

typedef struct my_struct
{
        int a;
        int b;
        int c;
} struct_int, *p_s;

struct_int struct_array[5];

私が思うに、もし間違っていたら訂正してください:

  1. typedef struct新しいタイプを作成しています。
  2. my_structはこの型の名前ですが、コードの残りの部分では使用されていません。
  3. struct_intコードで使用できる型の 1 つのインスタンスです。
  4. *p_s作成した 1 つのインスタンスへのポインタです。
  5. struct_array作成したインスタンスの配列です。(すでにインスタンスを作成しているので、この部分は私を混乱させます...)

また、構造体の配列を作成するときに、struct_int代わりにを使用するのはなぜmy_structですか?

4

6 に答える 6

4

struct my_structは型の名前であり、型でmy_structはなくタグ名です。

typedefC で型を作成しませんが、既存の型のエイリアス名を作成します。

于 2012-04-05T23:34:35.283 に答える
3

そうではありません!異なる部分の意味は次のとおりです。

struct my_struct: ここでは、オブジェクトの新しいインスタンスを作成するときに参照する新しいデータ型をstruct my_struct作成しています。たとえば、次のように言う必要がありstruct my_struct a;ます my_struct a;

typedef struct my_struct {} struct_int;: ここでは、 のエイリアスを作成しstruct my_structて名前を付けるだけstruct_intです。これからは、struct_int a;代わりに言うことができますstruct my_struct a;

typedef struct my_struct {} *p_s;ここでは、 を指すデータ型の新しいエイリアスを作成しますstruct my_struct。次のように使用できます。p_s newStruct = malloc(sizeof(struct_int));

于 2012-04-05T23:38:17.990 に答える
3

typedef struct新しいタイプを作成しています。

typedefと を定義してstruct_intおり、それぞれ ととp_s同義です。アイデアは、長い道のりを入力する必要をなくし、読みやすさを向上させることです (常にそうであるとは限りません)。struct my_structstruct my_struct*

my_structはこの型の名前ですが、コードの残りの部分では使用されていません。

my_structasを使用する必要があるためですがstruct my_struct、そのtypedefタイプstruct_intを参照する必要があり、より簡単です。

struct_intコードで使用できる型の 1 つのインスタンスです。

いいえ、上記をお読みください。を削除するtypedefと、2 つの変数と作成されます。struct_intp_s

*p_s作成した 1 つのインスタンスへのポインタです。

いいえ、上記をお読みください。

struct_array作成したインスタンスの配列です。(すでにインスタンスを作成しているので、この部分は私を混乱させます...)

struct_arrayは type の配列であるstruct_intため、 type の配列ですstruct my_structの定義にインスタンスは作成されませんstruct

また、構造体の配列を作成するときに、struct_int代わりにを使用するのはなぜmy_structですか?

上記の質問の 1 つと同じです。struct my_structorを使用できますがstruct_intstruct_intこれは短く、typedefingの目的を無効にしstruct_intます。

于 2012-04-05T23:40:15.197 に答える
2

my_structこのタイプの構造の名前です。後で、このタイプの構造体をさらに宣言するために使用できます。

struct_inttypedef によって作成されるエイリアスの名前です。

*p_smy_struct(aka struct_int) 型の構造体へのポインタです。このタイプの構造体を指すことができます。

struct_arrays の配列の名前ですmy_struct。ただし、エイリアスstruct_intで宣言されているため、後でエイリアスとして参照する必要があります。

エイリアスの使用は個人的な好みであり、実際にはmy_structまたはのいずれかstruct_intを削除できます。

于 2012-04-05T23:38:57.570 に答える
1

あなたの仮定は部分的に正しいです。3と4に入りたいと思います。

を削除しtypedefてこれを持っていた場合:

struct my_struct {
  // ...
} struct_int_v, *p_s_v;

次に、2 つの変数 struct_int_vを宣言p_s_vし、期待する型 (1 つはstruct my_structで、もう1 つはstruct my_struct*) を宣言します。

ただし、ストレージ指定子 typedefを導入すると、変数ではなく型を作成するように C に指示されますが、宣言の構文は同じです。

したがって、変数が持つstruct_intになり、変数が持つ型になります。struct_int_vp_sstruct_int_v

typedef(またはさらに言えstatic) のようストレージ指定子はconst、.volatile;

于 2012-04-05T23:44:22.700 に答える
1

あなたは主にあなた自身の質問に答えたので、残りの 2 つの点について説明します。

まず、struct定義が作成する型の名前は ですstruct my_struct。次のような変数を宣言できます

struct my_struct a;
struct my_struct b;

structしかし、常に書く必要はないので、 typedef. 構造とエイリアスを別々に定義する方が少し明確かもしれません:

struct my_struct {
  int a, b, c;
};
typedef struct my_struct struct_int;
typedef struct my_struct *p_s;

これは、最初に という型を定義し、struct my_struct次に型のエイリアスとして定義し、次にstruct_int型のエイリアスとして定義します。あなたが書いたコードは、これら 3 つのことをすべて 1 つにまとめたものですが、意味することは同じです。struct my_structp_sstruct my_struct *

次に、型エイリアスp_sは配列とは何の関係もありませんstruct_array。はの*p_s一部であるため、構造体のインスタンスを定義しませんtypedef。代わりに型エイリアスを定義します。しかし、 がなくtypedefp_sしたがって実際のポインター変数だったとしても、後で定義される配列は別個の無関係な変数です。

于 2012-04-05T23:44:54.997 に答える