「転」typedefの使い方を詳しく述べる

5784 ワード

テキストリンク:https://www.cnblogs.com/Howe-Young/p/3931678.html
typedefはタイプ再定義であることはよく知られていますが、再定義である以上新しいデータ型は現れず、既存のデータ型を名前を変えるだけですが、これは何の役に立ちますか?
私たちが学んだとき、与えられた例はすべて:typedef int INT;次に、INTで変数を定義します.たとえば、次のようにします.
typedef int INT;
INT a;

これはint aに等しい.私たちは当時何の役にも立たなかったので、構造体を学んだとき、データ型の書き方を減らすと思ったかもしれませんが、struct studentのような構造体で変数を定義するときはtypedefを使わないとstruct studentしかできません(もちろんC言語ではstructを省略してstudentを直接書くことができます)、面倒な感じがしたのでtypedefを使うことを考えました.しかし、これは彼の使い方の一つであり、唯一の使い方ではない.
typedefの使い方は主に3つの点をまとめました.
使い方1 ,構造体のような「新しい」データ型はtypedefで簡略化でき、エラーが発生しにくい.例:
struct student{

  int data;

  char name[10];

}; 

私たちが学生の構造体を定義するときにこのように定義するstruct student s1,s2,s3;構造体のポインタを定義したい場合は、このように定義することができます.struct student *ps1, ps2;は明らかにps 2はポインタタイプではありませんが、多くの初心者はポインタに慣れていないので、間違いやすいですが、typedefを使うと、このようなエラーは発生しません.
typedef struct student{

  int data;

  char name[10];

}stu, *pstu;  

私たちが定義するときにこのようにstu s1, s2, s3;構造体ポインタを定義できるときは、このように定義することができます.pstu ps1, ps2;このようにps 1、ps 2はポインタタイプの変数です.これはtypedefの使い方の一つであり、比較的よく使われています.
用法2 ,コードの拡張性と多重性がない場合、このコードは特別な規範のコードとは言えません.コードの多重性を実現し、プログラムの可読性を高めるために、関数を使うように、コードの多重性と拡張性を高めることはソフトウェア開発者として必要な能力です.良いコードは、他の項目で引用すると、機能が似ていれば基本的に何行も変更できないことが規範性の重要性です(ここでは規範性はともかく、このtypedefの使い方も規範性にかかわるので、へへ、規範は避けられません).構造体を定義すると
struct student{

  int score;

  char name[10];

};

私たちは成績をdoubleタイプに変えたいのですが、intの精度が低すぎるはずですが、以下で使うところは変えなければならないかもしれませんが、typedefを使うと問題が簡単になります.
typedef int typeitem;

struct student{

  typeitem score;

  char name[10];

};

このようにtypedefを直接変更すればいいのですが、他のコードはまったく動かないのです.これが の原因です.私たちは最下層のものだけを変更します.上層のものはまったく変更しません(チェーンテーブルのように、3層に分けることができます.純データ層、ノード層、headポインタ層、つまりチェーン全体です).このように階層処理の問題はずっと簡単になります.また、プラットフォームによっては互換性があります.long doubleタイプをサポートしていないプラットフォームもありますが、long doubleを定義している場合は直接使用できませんが、typedef long double typeitemです.サポートできるタイプに直結すればいいので、以下のコードを変更するのはそんなに面倒ではありません.これも重要な用途です.
使い方3 .この用途は上の用途に含まれているのではないかと思いますが、なぜもう一度言うのでしょうか.実は例を挙げるとわかりますが、typedef int array[10];、これはどういう意味ですか.これは普段のarray[10]がintではないでしょう.この代表、arrayは再定義のタイプです.array a;はaが10個のint型要素を含む配列であることを表し、このような定義はあまり簡略化されていないと感じるかもしれないが、直接int a[10]に及ばない.見てわかるよ、よし!続けて下を見ると、typedef array Array[5];これは、もし私がこのように変数Array arr[2];を定義したら、これはどういう意味ですか?これはArrayタイプの配列を定義します.この「1次元」配列には2つの要素がありますが、各要素はArrayタイプで、各Arrayは5行10列の2次元配列なので、arrは3次元配列です.彼はint arr[2][5][10];に等しいのではないでしょうか.実はC言語には多次元配列は存在しません.すべて1次元配列です.ただ1次元配列には1次元配列が含まれているので、いわゆる「多次元」配列を構成しています.このように理解すれば、多次元配列もそんなに「不思議」ではないと思いますか.簡単になりました.そんなに気絶していません.このように定義されたメリットは、多次元の配列が私たちがよく知っている1次元配列に転化することです.これにより操作が容易になり、読みやすさも自然に向上します.だからこれが彼の「簡略化」の役割だ.実は私达はまた関数の指针の上で体现することができて、个の関数の指针int (*p)();を定义したい私达はtypedef int (*POWER)();と定义することができて、次に直接POWER p1, p2;を定义することができて、int (*p1)(), int (*p2)();に等価です
メソッドの定義
次に彼の定義過程について話します.こんなにたくさん話しても、どのように定義するかはまだ話していませんが、実は3つのステップです.
  • 第1歩:変数を定義する方法に従って定義体を先に書きます(きっとこのようにすべて比較的に熟知しているでしょう)、例えば:int a;
  • ステップ2:変数名を再定義したい名前に変更します.たとえば、int INT;
  • ステップ3:先頭にtypedefを付ける例:typedef int INT;手順全体が完了し、次に再定義されたタイプで変数を定義できます.たとえば、INT a;そんなに简単だから、そんなに复雑に考えないでください.

  • マクロ定義#マクロテイギ#
    また、マクロ定義と区別して、マクロ定義は前処理をコンパイルするときに直接行われる置換ですが、typedefはそうではありません.マクロ定義、特にその式を書くときに初心者がエラーを起こしやすいのは、マクロ置換を本当に理解できないことです.このような例:#define mul(a,b)a*b、mul(2,3)と書けばおめでとうございますが、そう書けば、 mul(2 + 1, 3 + 4); あなたの結果は間違いに違いありません.簡単に置き換えるだけで、関数のように2+1が3に等しいと計算して計算することはありません.2+1*3+4に置き換えるしかありません.だから結果は間違いです.初心者が注意すればいいです.これは簡単です.
    大体こんなに多くて、もしそこに書くのがよくないならば、多く指導して、多く補充します!
    転載先:Howe_Young