1.構造体タイプ定義

定義方法1:

Typedef struct  LNode {
   int  data;  // 数据域
   struct LNode   *next;  // 指针域
} *LinkList;

定義方法2:

struct  LNode {
   int  data;  // 数据域
   struct LNode   *next;  // 指针域

};
Typedef struct  LNode  *LinkList;

上記の2つの定義方法は等価であり、つまり*LinkList定義としてstruct LNode类型,即LinkList型名として定義される。これにより、以下のように使用できる。LinkList新しい変数を定義・宣言するために使用します。例:

LinkList  L;

即将Lと定義するstruct LNode型のポインタ変数。

2. 構造体型変数の定義

定義方法1:

struct  LNode {
   int  data;  // 数据域
   struct LNode   *next;  // 指针域

}LnodeA;

定義方法2:

struct  LNode {
   int  data;  // 数据域
   struct LNode   *next;  // 指针域

};
struct  LNode LnodeA;

上記の2つの定義方法も等価であり、これによりLnodeAとして定義されるstruct LNode型の変数、すなわちLnodeA一つの〜としてstruct LNode型の変数名。


構造体の内部テーブルの定義方法

1. 構造体、透過テーブル領域、DATA ELEMENT、DOMAIN

透明テーブルは物理テーブルの論理的な記述です。透明テーブルには多くのフィールドがあり、特定のフィールドがPRIMARY KEYとして定義されます。フィールドには、言語属性と技術属性を記述するDATA ELEMENTが含まれます。DATA ELEMENTには、データ型とフィールド長を定義するDOMAINが含まれます。

構造体は通常、構造変数を定義するために使用され、一時データの保存領域を持ち、PRIMARY KEYはありません。構造体にはFIELDではなくCOMPONENTが含まれます。

2.Internal table の属性は、LINE TYPE、KEY、TABLE KIND の3種類に分けられます。

INTERNAL TABLE内の1行をLINE TYPEと呼び、各行の構造はすべて同じです。

KEY: データベースの主キーに相当します。ソートの際に有用で、UNIQUEまたはNON-UNIQUEがあります。

TABLE KIND:STANDARD、SORTED、HASHED に分けられます。

3種類の内部テーブルの定義

标准表:

DATA itab1 TYPE STANDARD TABLE OF scarr WITH NON-UNIQUE KEY carrid.

排序表:

DATA itab2 TYPE SORTED TABLE OF scarr WITH NON-UNIQUE KEY carrid.

哈希表:

DATA itab3 TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.

一般的な定義方法(標準テーブル)

データベーステーブルに基づいて標準テーブルを定義します

DATA itab4 TYPE TABLE OF scarr.

自前の構造変数に基づいて標準テーブルを定義します(最も一般的)。

DATA: BEGIN OF wa,
    carrid TYPE scarr-carrid,
    carrnamen TYPE scarr-carrname,
    END OF wa.
DATA itab5 LIKE TABLE OF wa.

データディクショナリのテーブルタイプに基づいて標準テーブルを定義します。

DATA itab6 TYPE ztabtype00_1.

内部テーブルに基づいて内部テーブルを定義する

DATA itab7 LIKE itab6.

内部テーブルに基づいて構造を定義する

DATA wa1 LIKE LINE OF itab7.

3. 構造を定義する方法

データディクショナリのテーブルまたは構造体に基づいて、プログラムの構造変数(または型)を定義します。

types str1 type spfli.
data str2 type  sflight.

プログラム内の構造変数(または型)を独自に定義します-最も一般的です。

data: begin of wa,
carrid type spfli-carrid,
com(10) type c,
end of wa.

内部テーブルに基づいて構造を定義する

data wa like line of itab.

注:データベーステーブルから定義されるものは必ず構造です

同名フィールドの代入(重要)

Move-corresponding A  to  B.

readは内部テーブルの1件のデータを読み取ります。

read table itab like table of wa.

内部テーブルの複数件のデータを読み取るにはloopを使用します。

loop at itab into wa.

C/C++ 言語での説明

结构体定义

構造体(struct)は、同じ型または異なる型を持つ一連のデータから構成されるデータ集合であり、構造とも呼ばれます。

结构体作用

構造体は他の基本データ型(int型、char型など)と同じですが、構造体は必要なデータ型にカスタマイズできる点が異なります。将来の使用に便利です。

実際のプロジェクトでは、構造体は数多く存在します。開発者は構造体を使用して属性をカプセル化し、新しい型を構成することがよくあります。

構造体の関数における役割は簡素化ではなく、その最も重要な役割はカプセル化です。カプセル化の利点は再利用が可能になることです。利用者はそれが何であるかを気にする必要がなく、定義に従って使用するだけで済みます。

構造体のサイズとメモリのアライメント

構造体のサイズは、構造体の要素を単純に合計しただけでは決まりません。現在の主流コンピュータは32ビットのCPUを使用しており、このタイプのCPUでは4バイトの数値を取得する方が1バイトを取得するよりも効率的で便利だからです。したがって、構造体内の各メンバーの先頭アドレスが4の倍数であれば、データ要素を取得する際により効率的になります。これがメモリアライメントの由来です。

各プラットフォームのコンパイラには、独自のデフォルトの「アライメント係数」(アライメントモジュラスとも呼ばれます)があります。プログラマはプリコンパイルコマンドを使用して...#pragma pack(n),n=1,2,4,8,16でこの係数を変更します。ここでのnが指定する「アライメント係数」です。

规则:

  
  • 1. データメンバーのアライメント規則: 構造体(struct)(または共用体(union))のデータメンバーは、最初のデータメンバーをoffset 0の場所に配置し、以降の各データメンバーのアライメントは次の規則に従います。#pragma pack指定された値とこのデータメンバー自身の長さのうち、小さい方に従って行われます。
  • 2. 構造体(または共用体)の全体アライメント規則: データメンバーがそれぞれのアライメントを完了した後、構造体(または共用体)自体もアライメントを行う必要があります。アライメントは< span class="marked">#pragma packで指定された値と構造体(または共用体)の最大データメンバー長のうち、小さい方に従って行われます。
  • 3. 1と2を組み合わせると推測できます: #pragma packのn値がすべてのデータメンバーの長さ以上の場合、このn値の大きさは効果を発揮しません。

C++ における構造体

C言語では、構造体型を定義して、複数の関連する変数をひとつの全体としてまとめて使用できます。構造体内の変数は、同じデータ型、一部が同じデータ型、または完全に異なるデータ型にすることができます。C言語では、構造体は関数を含むことはできません。オブジェクト指向プログラミングでは、オブジェクトは状態(属性)と振る舞いを持ち、状態はメンバ変数に格納され、振る舞いはメンバメソッド(関数)によって実現されます。C言語の構造体はオブジェクトの状態のみを記述でき、オブジェクトの振る舞いを記述することはできません。C++では、C言語からC++言語への移行の連続性を考慮して、構造体が拡張されました。C++の構造体は関数を含むことができるため、C++の構造体もクラスの機能を持ちます。classと異なるのは、構造体に含まれる関数はデフォルトでpublicであり、privateではないことです。

C++ コンソール出力の例:

 

实例

#include <cstdlib>  #include <iostream>//定义结构体 using namespace std;  struct point  {   //包含两个变量成员 int x;   int y;  };   int main(int argc, char *argv[])  {   struct point pt;  pt.x=1;  pt.y=2;  cout<<pt.x<<endl<<pt.y<<endl; return EXIT_SUCCESS; }

C++における構造体とクラスの違い

クラスと構造体のC++における違いは2点だけで、これ以外には何の違いもありません。

  • (1)classではデフォルトのメンバーアクセス権限はprivateですが、structではpublicです。
  • (2)classからの継承はデフォルトでprivate継承ですが、structからの継承はデフォルトでpublic継承です。

この2つの定義にはどのような違いがありますか?

typedef struct student
{
    int num;
    struct student *next;
}student;

struct student
{
    int num;
    struct student *next;
};

2番目のstruct studentはstudent構造体を定義しています。これはわかりますね。

1番目はtypedefを使用してstruct studentという構造体型名をstudentとして再定義しています。つまり、struct studentとstudentは同じものを表し、どちらも型の識別子です。例えば、typedef int zhengshu; はint型をzhengshuに改名したものです。次の定義: int i; と zhengshu i; の2つの文は等価です。

構造体は基本データ型で構成され、1つの識別子で命名されたさまざまな変数の組み合わせです。構造体では異なるデータ型を使用できます。

構造体の宣言と構造体変数の定義

Turbo Cでは、構造体もデータ型であり、構造変数を使用できます。したがって、他の型の変数と同様に、構造変数を使用する際にはまず定義する必要があります。

構造体変数を定義する一般的な書式は次のとおりです。

struct 结构名
{ 
    类型 变量名;
    类型 变量名;
...
} 结构变量;

構造体名は構造体の識別子であり、変数名ではありません。

型は第2節で説明した5つのデータ型(整数型、浮動小数点型、文字型、ポインタ型、無値型)です。

構造体を構成する各型変数は構造体メンバーと呼ばれます。これは配列の要素に似ていますが、配列の要素は添え字でアクセスするのに対し、構造体では変数名でメンバーにアクセスします。

次に、構造変数の定義方法を説明する例を示します。

struct string 
{ 
    char name[8]; 
    int age; 
    char sex[4]; 
    char depart[20]; 
    float wage1,wage2,wage3; 
}person; 

この例では、構造体名がstringの構造変数personを定義しています。変数名personを省略すると、構造体の説明になります。説明済みの構造体名を使用して構造変数を定義することもできます。このように定義する場合、上記の例は次のようになります。

struct string 
{ 
    char name[8]; 
    int age; 
    char sex[4]; 
    char depart[20]; 
    float wage1,wage2,wage3; 
}; 
struct string person;

同じ形式の複数の構造変数を定義する必要がある場合は、この方法が便利です。まず構造体の説明を行い、次に構造体名を使用して変数を定義します。

例如:

struct string Tianyr, Liuqi, ...;

構造体名を省略した場合は、無名構造体と呼ばれます。これは関数内部でよく見られます。この構造体を使用する場合、前述の例は次のようになります。

struct 
{ 
    char name[8]; 
    int age; 
    char sex[4]; 
    char depart[20]; 
    float wage1,wage2,wage3; 
} Tianyr, Liuqi;

構造変数の使用

構造体は新しいデータ型であり、構造変数も他の型の変数と同様に代入や演算ができます。異なる点は、構造変数がメンバーを基本変数とすることです。

構造体メンバーの表記方法は次のとおりです。

構造変数.メンバー名

構造変数.メンバー名を1つのまとまりと見なすと、このまとまりのデータ型は構造体内のそのメンバーのデータ型と同じです。したがって、前述の変数のように使用できます。

次の例では、構造体変数を定義し、各メンバーがキーボードからデータを受け取り、構造体内の浮動小数点数を合計して、演算結果を表示します。この例における異なる構造体メンバーへのアクセス方法に注目してください。

实例

#include <stdio.h> #include <conio.h> int main() { struct { char name[8]; int age; char sex[4]; char depart[20]; float wage1,wage2,wage3; }a; float wage; char c='Y'; while(c=='Y'||c=='y') { printf(\nName:); scanf(%s, a.name); printf(Age:); scanf(%d, &a.wage); printf(Sex:); scanf(%s, a.sex); printf(Dept:); scanf(%s, a.depart); printf(Wage1:); scanf(%f, &a.wage1); printf(Wage2:); scanf(%f, &a.wage2); printf(Wage3:); scanf(%f, &a.wage3); wage=a.wage1+a.wage2+a.wage3; printf(The sum of wage is %6.2f\n, wage); printf(Continue?); c=getche(); } }

構造配列と構造ポインタ

構造体は新しいデータ型であり、構造体配列や構造体ポインタも同様に持つことができます。

1.構造配列

構造体配列とは、同じ構造体型を持つ変数の集合です。例えば、クラスの40人の生徒の名前、性別、年齢、住所を定義する場合、構造体配列として定義できます。次に示すとおりです。

struct
{ 
    char name[8]; 
    char sex[4]; 
    int age; 
    char addr[40]; 
}student[40];

次のようにも定義できる:

struct string
{ 
    char name[8]; 
    char sex[4]; 
    int age; 
    char addr[40]; 
}; 
struct string student[40];

構造体配列メンバーへのアクセスは、配列要素を構造変数として行うことに注意してください。その形式は次のとおりです。

構造体配列要素.メンバー名

例如:

student[0].name 
student[30].age 

実際、構造体配列は2次元構造に相当します。第1次元は構造体配列の要素であり、各要素は構造変数です。第2次元は構造体メンバーです。

注意構造体配列のメンバーは配列変数にすることもできます。

例如:

struct a 
{ 
    int m[3][5]; 
    float f; 
    char s[20]; 
}y[4];

構造体aの中の構造体変数にアクセスするにはy[2]この変数は、次のように記述できます。y[2].m[1][4]

2.構造ポインタ

構造体ポインタは構造体を指すポインタです。構造変数名の前に付ける*演算子で定義されます。例えば、前述で説明した構造体を使用して構造体ポインタを定義すると次のようになります。

struct string
{ 
    char name[8]; 
    char sex[4]; 
    int age; 
    char addr[40]; 
}*student;

構造体ポインタ名を省略して構造体の説明のみを行い、その後以下の文で構造体ポインタを定義することもできます。

struct string *student; 

構造体ポインタを使用した構造体メンバーへのアクセスは、構造変数による構造体メンバーへのアクセスとは表現方法が異なります。構造体ポインタによる構造体メンバーへのアクセスは次のように表されます。

構造体ポインタ名->構造体メンバー

其中->は2つの記号です-と>の組み合わせは、矢印が構造体メンバーを指しているように見えます。例えば、上記で定義した構造体のnameとageに値を代入するには、次の文を使用できます。

strcpy(student->name, Lu G.C); 
student->age=18;

实际上,student->nameつまり(*student).nameの省略形。

構造体ポインタは構造体を指すポインタ、つまり構造体の最初のメンバーの先頭アドレスであることに注意してください。したがって、使用前に構造体ポインタを初期化する必要があります。つまり、構造体全体の長さのバイト空間を割り当てます。これは次の関数で実行できます。前述の例で説明すると以下のようになります。

student=(struct string*)malloc(size of (struct string));

size of (struct string)string構造体のバイト長を自動的に取得します。malloc()関数は構造体の長さのサイズのメモリ領域を定義し、その先頭アドレスを構造体ポインタとして返します。

注意:

  • 1. 構造体はデータ型であるため、定義された構造変数や構造体ポインタ変数には、定義位置に応じてローカル変数とグローバル変数があります。
  • 2. 構造変数名はその構造体を指すアドレスではありません。これは配列名の意味とは異なります。したがって、構造体内の最初のメンバーの先頭アドレスを求める必要がある場合は、次のようにすべきです。&[结构变量名]。
  • 3. 構造体の複雑な形式: ネストされた構造体

ネストされた構造体とは、1つの構造体メンバーの中に別の構造体を含めることができるものです。Turbo Cはこのネストを許可します。

例: 次はネストされた構造体です。

struct string
{ 
    char name[8]; 
    int age; 
    struct addr address; 
} student; 

ここで、addrは別の構造体の構造体名です。事前に説明(宣言)を行う必要があります。つまり、

struct addr
{ 
    char city[20]; 
    unsigned lon zipcode; 
    char tel[14]; 
}

student構造体のメンバーであるaddress構造体内のzipcodeに値を代入する場合は、次のように記述できます。

student.address.zipcode=200001; 

各構造体メンバー名は、最外層から最内層まで順に列挙されます。つまり、ネストされた構造体メンバーの表現方法は次のとおりです。

構造変数名.ネスト構造変数名.構造体メンバー名

ネストされた構造体は多数存在できます。構造体メンバー名は、最内層の構造体の中で構造体ではないメンバーの名前です。

原文链接:https://www.cnblogs.com/yuxinJ/p/4688496.html