ディレクトリ
構造
1.構造タイプを定義します
この構造では、さまざまなタイプのデータ要素を組み合わせて新しいデータタイプを形成できます。その宣言形式は次のとおりです。
struct 结构体类型名 {
成员列表
};
構造型宣言は通常、プログラムファイルの先頭に配置され、この宣言は現時点ではグローバルです。この宣言はグローバルスコープのどこにでも表示されるため、同じスコープ内のすべての関数で使用できます。構造型宣言は関数内に配置することもできます。その場合、宣言はローカルです。
説明:
(1)構造タイプと共通データタイプ(int、char、doubleなど)はタイプ名であり、タイプのエンティティではないため、構造タイプにストレージスペースは割り当てられません。
(2)構造型が宣言されると、メンバーは再び構造型になることができます。(つまり、ネストすることができます)
2.構造タイプのインスタンス化
構造オブジェクトの定義は、構造タイプのインスタンス化と呼ばれ、インスタンス化により、データタイプに従って構造オブジェクトにメモリユニットが割り当てられます。構造オブジェクトの定義には2つの形式があります。
1)最初に構造タイプを宣言し、次にオブジェクトを定義します
struct atudent;
student a,b;
2)構造型を宣言しながらオブジェクトを宣言する
DATE { //日期类型
int year,month,day; //年,月,日 整型
} d1,d2; //定义结构体对象
3.構造オブジェクトのメモリ形式
構造オブジェクトをインスタンス化した後、オブジェクトはストレージスペースを取得します
struct STUDENT { //学生信息类型
int no; //声明一个整型数据成员表示学号
char name[21]; //声明一个字符串数据成员表示姓名
char sex; //声明一个字符数据成员表示性别
int age; //声明一个整型数据成员年龄
char qq[11]; //声明一个字符串数据成员表示QQ号
double score; //声明一个浮点型数据成员表示成绩
};
構造オブジェクトが定義されたときに初期化できます
struct STAFF { //职员信息类型
int no; //工号,整型
char name[21]; //姓名,字符串
char sex; //性别,字符型
DATA birthday; //出生日期,结构体类型
double salary; //薪水,浮点型
};
STAFF s1={1001,"Li Min",'M',{1980,10,6},2700.0};
STAFF s2={1002,"Ma Gang",'M',1978,3,22,3100.0};
4.構造オブジェクトのメンバー参照
構造オブジェクトの使用は主にそのメンバーを参照することであり、一般的な形式は次のとおりです:
構造オブジェクト名。メンバー名
STAFF a,b;
a.no=10002; //将10002赋值给a对象中的no成员
b.salary=a.salary+500.0; //在表达式中可以引用对象成员
a.no++; //按优先级等价于(a.no)++
- メンバー自体が構造オブジェクトである場合、レベルごとに参照されるメンバー参照演算子を使用する必要があります。
- 構造オブジェクト全体を入力または出力することはできません。構造オブジェクトのメンバーを1つずつ入力または出力することしかできません。(ただし、カスタム関数またはオーバーロードされた演算子によって実装できます)
- 構造オブジェクトには演算を割り当てることができますが、算術演算、関係演算などには使用できません。
5.構造と配列、ポインタ、関数
構造と配列。配列要素は、構造型にすることができ、構造配列になります。など:
struct POINT { //点类型
int x,y; //平面上点的x、y坐标
};
POINT points[100]; //表示100个点的数据对象
1次元配列構造が初期化され、1対1の対応でメモリの形で破棄する必要があります。
struct RECT { //矩形框类型
int left,top,right,bottom;
};
RECT rects[3]={{1,1,10,10}, {5,5,25,32},{100,100,105,200}};
構造体の配列メンバーを参照するには、配列添え字操作とオブジェクトメンバー参照操作を組み合わせる必要があります。
rects[0].left=10;
構造型には配列メンバーを含めることができます。配列メンバー型は、基本データ型、ポインター型、または構造型のいずれかです。
struct TRIANGLE { //三角形类型
POINT p[3];//由3个平面上的点描述三角形
};
TRIANGLE tri;
tri.p[0].x=10,tri.p[0].y=10;
//结构体对象.数组成员[下标表达式].成员名
構造とポインタ。構造オブジェクトの各メンバーのアドレス:&オブジェクト名。メンバー名。
int *p1; //指向no成员的指针类型是int*
char *s1,*s2; //指向name、sex成员的指针类型是char*
STAFF m; //结构体对象
p1=&m.no; //取no成员的地址
DATE *p2; //指向birthday成员的指针类型是DATE*
s1=m.name; //name成员是数组,数组名即是地址
s2=&m.sex; //取sex成员的地址
p2=&m.birthday; //取birthday成员的地址
構造オブジェクトのアドレス:&オブジェクト名。たとえば
struct STAFF m, *p; //指向结构体对象的指针
p=&m; //取结构体对象的地址
pが構造体オブジェクトへのポインタであると仮定すると、pを介して構造体オブジェクトメンバー
を参照する方法は2つあります
。① オブジェクトメソッド:(* p)。メンバー名;
②ポインターメソッド:p->メンバー名。
2番目の方法はより一般的に使用されます->ポインターメンバーの参照演算子。
struct STAFF *p;
p->no=10002; //将10002赋值给对象中的no成员,指针成员引用运算结果是左值(即成员本身)
p->salary=p->salary+500.0; //在表达式中引用指针指向的成员
p->no++; //按优先级等价于(p->no)++
メンバー自体が構造オブジェクトへのポインターである場合、ポインターメンバーは、演算子のレベルで参照メンバーを参照するために使用されます。
DATE d={1981,1,1};
TEACHER { //教师信息类型
int no; //工号
char name[21]; //姓名
DATE *pbirthday; //出生日期
} a={1001,"Li Min",&d}, *p=&a;
p->no=10001; //通过指针p引用a的no成员
p->pbirthday->year=2008; //通过指针p->pbirthday引用d的year成员
構造と関数
Structureオブジェクトは、値転送の関数を使用して、入力パラメーターとして使用されます。
struct DATA {
int data; //整型成员
char name[10]; //数组成员
};
void fun1(DATA x); //函数原型
void fun2(){
DATA a={1,"LiMin"};
fun1(a); //函数调用
}
構造問題配列は入力パラメーターとして使用され、アドレスは送信に使用されます。関数呼び出しの実際のパラメーターは配列の名前であり、仮パラメーターは同じタイプの構造体の配列でなければなりません。アドレス転送方法を使用すると、仮パラメーターグループの最初のアドレスは、実際のパラメーターグループとまったく同じになります。
void fun3(DATA X[]); //函数原型
void fun4(){
DATA A[3]={1,"LiMin",2,"MaGang",3,"ZhangKun"};
fun3(A); //函数调用
}
関数パラメーターとして構造体ポインターを使用し、アドレス転送メソッドを使用します
void fun5(DATA *p); //函数原型
void fun6(){
DATA a={1,"LiMin"};
fun5(&a); //函数调用
}
関数の戻り値の型は、構造体型にすることができます。
DATA fun8(){
DATA a={1,"LiMin"};
return a; //返回结构体对象,复制到临时对象中
}
void fun9(){
DATA b;
b=fun8(); //函数返回结构体对象,并且赋值
}
コミュニティー
union A {
int m,n; //整型成员
char a,b; //字符成员
};
構造とコモンズ:
メモリ長の構造は、全てのメモリの長さの合計です。sizeofを使用して、メモリ長を確認できます。
共通オブジェクトを定義するときに初期化を実行できますが、初期値を指定できるメンバーは1つだけです。
union A x={ 5678 }; //正确,只能给出1个初值
union A y={5,6,7,8}; //错误,试图给出4个初值(结构体做法)
メンバーは共有ストレージスペースであるため、共通オブジェクトのメンバーを使用する場合の次の特性:
- 1つのメンバーを変更すると、他のメンバーも変更され、すべてのメンバーが最後の変更の結果を保存します。
- すべてのメンバーの値は同じですが、タイプが異なるとこの値のすべてまたは一部の使用が決まるという違いがあります。
- すべてのメンバーの開始アドレス値は同じであるため、通常は1つのメンバーのみが入力され、初期化されます。
コミュニティは、大小の目的をテストするために使用できます。
void checkCPU()
{
union MyUnion{
int a;
char c;
}test;
test.a = 1;
if (test.c == 1)
cout << "little endian" <<endl;
else cout << "big endian" <<endl;
}
列挙型
列挙型は、複数の名前付き列挙定数で構成されるユーザー定義型です
enum DAYS {MON,TUE,WED,THU,FRI,SAT,SUN};
- 列挙型を(のみ)宣言するときに、名前付き列挙定数の値を指定できます。
enum COLORS {RED=10,GREEN=8,BLUE,BLACK,WHITE};
次に、REDは10、GREENは8、BLUEは9、BLACKは10、WHITEは11です。
- 名前付き列挙定数は整数定数値であり、列挙子とも呼ばれ
、列挙型のスコープ内で一意である必要があります。名前付き列挙定数は、左辺値ではなく右辺値です。
RED=10; //错误,RED不是左值,不能被赋值
GREEN++; //错误,GREEN不是左值,不能自增自减
typedef
typedefを使用して、次の形式で、既存の型名の代わりに新しい型名を宣言できます
。►ここで、既存の型名は既存のデータ型の名前でなければならず、新しい型名は識別子です
typedef 已有类型名 新类型名;
大文字になっている文字シーケンス。新しいタイプ名が複数ある場合は、間隔としてカンマ(、)を使用します。最後に、セミコロン(;)で終わります。たとえば、次のとおりです。
typedef unsigned char BYTE; //按计算机汇编指令习惯规定的字节型
typedef unsigned short WORD; //按计算机汇编指令习惯规定的字类型
typedef unsigned long DWORD; //按计算机汇编指令习惯规定的双字类型