記事のディレクトリ
まず、構造の概念
我々は、上記の変数とアレイ(配列)を説明するチュートリアル、定義された変数であり、配列は同じタイプの変数の集まりです。しかし、本当の生活や仕事で、変数の異なるデータ型を使用する必要性をデータのセットを表現するためです。各要素のデータ型が配列を格納するために使用することができない異なるデータセットのためのスーパーガール例えば、基本的な情報、文字列の名前、身長および年齢は、ストリングの整数、浮動小数点数の重量、サイズおよび色値です。
あなたは、情報スーパーの女の子を保存したい場合は、次のような知識で、私たちが学んだ前に、あなたは、複数の変数を使用することができます。
char name[51]; // 姓名
int age; // 年龄
int height; // 身高,单位:cm
double weight; // 体重,单位:kg
char sc[31]; // 身材,火辣;普通;飞机场
char yz[31]; // 颜值,漂亮;一般;歪瓜裂枣
データセットは、パラメータとして変数の伝達関数に面倒をエレメント100、100は、変数、初期化変数100を定義する必要があり、100を持っている場合、このアプローチは、欠点を有しています。
C言語、異なるタイプのデータのセットを格納するための構造体(構造体)は、次の構文で。
struct 结构体名
{
结构体成员变量一的声明;
结构体成员变量二的声明;
结构体成员变量三的声明;
......
结构体成员变量四的声明;
};
構造は、プログラマが自分自身からデータ型定義データセットを記述するために、構成データのタイプであるコレクションです。構造(部材)のメンバーは、構造が可変であってもよい、変数の任意のタイプであってもよいです。スーパーガールの例に:
struct st_girl
{
char name[51]; // 姓名
int age; // 年龄
int height; // 身高,单位:cm
int weight; // 体重,单位:kg
char sc[31]; // 身材,火辣;普通;飞机场
char yz[31]; // 颜值,漂亮;一般;歪瓜裂枣
};
第二に、構造体変数
構造テンプレートは、変数を定義するために使用することができ、プログラマ定義のデータ型です。例えば:
struct st_girl queen, princess, waiting, workers;
構造は4つの変数、女王の女王、王女プリンセス、待っている女性および付随する労働者を定義します。
第三に、メモリ集約型の場合
、アレイの各メンバーが行に格納されているメモリ内の構造理論の点で非常に類似しているが、構造体のためのメモリの総サイズは、必ずしもメンバー変数とするメモリの合計サイズと等しくありません。コンパイラの特定の実現では、メモリアドレッシングの効率を改善するために、各種部材との間に隙間があってもよいです。含有量は、全サイズはsizeof、はsizeof(名称構造)またはに占める構造によって得ることができる
のsizeof(変数名の構造)を使用することができます。
実施例(book90.c)
/*
* 程序名:book90.c,此程序用于演示C语言的结构体占用内存的情况
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
int height; // 身高,单位:厘米cm
char sc[30]; // 身材,火辣;普通;飞机场。
char yz[30]; // 颜值,漂亮;一般;歪瓜裂枣。
};
int main()
{
struct st_girl queen;
printf("sizeof(struct st_girl) %d\n",sizeof(struct st_girl));
printf("sizeof(queen) %d\n",sizeof(queen));
}
業績
上記の例から分かるように、構造体
st_girlメモリがすべてのメンバ変数によって占有する50 + 4 + 4 + 30 + 30 = 118であるが、構造は、メモリ120によって占められています。
注、C言語では、メモリアライメント構造体メンバーのための方法を提供し、あなたはメモリ構造体のメンバ変数の間にはギャップではない、私が導入していないことができます。
第四に、変数名の構造
そして、配列は、構造体変数の構造、構造体変数名が同じint型IIのように、変数名ではなく、直接出力、ダイレクト出力が意味をなさないことはできませんアドレス変数名と同じではありませんではありません。テイク&アドレスの使用に、ない行き止まりではなく、ライン上に直接出力します。
struct st_girl stgirl;
printf("%d\n",stgirl); // 没有意义。
printf("%p\n",stgirl); // 没有意义,结构体变量名不是结构体变量的地址。
printf("%p\n",&stgirl); // 这才是结构体的地址。
第五に、構造が初期化されます
memsetの機能を使用すると、すべてのメンバ変数の値がクリアされ、構造を初期化します。
memset(&queen,0,sizeof(struct st_girl));
若しくは
memset(&queen,0,sizeof(queen));
構造体のアドレス(例えば構造体構造体へのポインタと、サブルーチン、サブルーチンに渡された場合は、
st_girl
* PST)構造の着信アドレスを格納し、次に、以下の方法が機能のみをすることができ構造体を初期化するには:
memset(pst,0,sizeof(struct st_girl));
次のメソッドは、構造体を初期化するために使用することはできません。
memset(pst,0,sizeof(pst));
sizeof(PST)とサブ機能するので、得られた構造は、メモリのバイト数によって占められるが、メモリのバイト(8バイト)の構造ポインタ変数の数を占有されていません。
訪問の六人のメンバー(使用します)
すなわち、ドットを使用する。オペレータは、共通のメンバ変数と変数を使用して、同じ構造を使用して、構造体のメンバ(使用)にアクセスします。
実施例(book92.c)
/*
* 程序名:book92.c,此程序演示结构体的访问(使用)。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
int height; // 身高,单位:厘米cm
char sc[30]; // 身材,火辣;普通;飞机场。
char yz[30]; // 颜值,漂亮;一般;歪瓜裂枣。
};
int main()
{
struct st_girl queen; // 定义结构体变量
// 初始化结构体变量
memset(&queen,0,sizeof(struct st_girl));
// 对结构体每个成员赋值
strcpy(queen.name,"武则天");
queen.age=28;
queen.height=168;
strcpy(queen.sc,"火辣");
strcpy(queen.yz,"漂亮");
printf("姓名:%s\n",queen.name);
printf("年龄:%d\n",queen.age);
printf("身高:%d\n",queen.height);
printf("身材:%s\n",queen.sc);
printf("颜值:%s\n",queen.yz);
}
業績
構造体の七つの配列
構造は、配列変数として定義することができる、配列変数の性質の他のタイプとの違いはありません。
struct st_girl princess[6];
memset(princess,0,sizeof(princess));
strcpy(princess[0].name,"杨玉环");
princess[0].age=18;
strcpy(princess[1].name,"西施");
princess[1].age=28;
……
実際の開発では、我々はめったに構造体の配列を使用しない、ベクトルコンテナC ++標準ライブラリには、構造体の配列よりも便利な構造の動的配列です。
八、構造体のポインタ
構造は、構造変数は、メモリ変数であり、メモリアドレスが存在し、それは構造体へのポインタを有し、自己定義のデータ型です。
我々が研究しているポインタの章では、異なるデータ型のアドレス変数にデータポインタの異なる種類を使用して、このルールにも構造にも適用されます。次のとおりです。
struct st_girl queen;
struct st_girl *pst=& queen;
これは、構造部材の構造のポインタ、一般的な形で使用することができます。
(*pointer).memberName
または:
pointer->memberName
ブラケットの両側に第1の書き込み、*オーバードット。優先順位、(*ポインタ)を小さくすることができません。あなたは* pointer.memberNameを書いブラケットを取り外した場合は意味が完全に間違っているので、それは、*(pointer.memberName)と同等です。
第2の書き込みでは、 - >それはそれで、構造部材の構造ポインタによって直接使用することができる、「矢印」を呼び出すために使用される新しい演算子であり、これは - >使用中の唯一の言語でC。
上記は、通常、これは、より直感的に、後に書かれた2ウェイ、プログラマと同等です。
実施例(book93.c)
/*
* 程序名:book93.c,此程序演示结构体的指针
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
};
int main()
{
struct st_girl *pst,queen; // 定义结构体变量
// 初始化结构体变量
memset(&queen,0,sizeof(struct st_girl));
pst=&queen;
// 对结构体每个成员赋值
strcpy(pst->name,"武则天");
pst->age=28;
printf("姓名:%s,年龄:%d\n",queen.name,queen.age);
printf("姓名:%s,年龄:%d\n",pst->name,pst->age);
printf("姓名:%s,年龄:%d\n",(*pst).name,(*pst).age);
}
業績
コピーナイン、構造
C言語では、文字列は、我々は構造にしたい場合は、strcpyの機能を付与することができる基本的なデータ型、文字列でない場合、構造体のメンバは、基本的なデータ型(int型、char型、ダブル)=数は、割り当てることができますされている場合別の構造変数に割り当てられた変数の値は、二つの方法がある:1)この方法は、誰も使用厄介であった、別の構造変数のメンバーに割り当てられた構造体の一方のメンバーによって変数の値であり、2 )別の方法は、メモリ・コピーであり、C言語は、(メモリのmemcpyを提供する
メモリコピー機能を実現するため、コピー速記)。
関数の宣言:
void *memcpy(void *dest, const void *src, size_t n);
パラメータ:
SRCメモリ変数の元の開始アドレス。
DEST宛先メモリ変数の開始アドレス。
Nバイトの数は、コンテンツをコピーする必要がありました。
関数はdestにはアドレスポイントを返し、関数が少し意義の値を返し、プログラマは一般的に、戻り値を気にしないでください。
実施例(book94.c)
/*
* 程序名:book94.c, 此程序演示采用memcpy函数复制结构体
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
};
void main()
{
struct st_girl girl1,girl2;
strcpy(girl1.name,"西施"); // 对girl1的成员赋值
girl1.age=18;
// 把girl1的内容复制到girl2中
memcpy(&girl2,&girl1,sizeof(struct st_girl));
printf("girl1.name=%s,girl1.age=%d\n",girl1.name,girl1.age);
printf("girl2.name=%s,girl2.age=%d\n",girl2.name,girl2.age);
}
業績
あなたはstrcpyの機能を考えることができ、memcpyのは、実際には、類似しており、この2つの関数の機能からして、この異なる仕上げの原則を実装し、でもそれらを一緒に入れてはいけません。
1)異なるコピーした内容、唯一の文字列のstrcpy、memcpyのをコピーして、そのような文字列、整数、構造体の内容をコピーすることができ、などが挙げられます。
2)文字列をコピーするときに他のタイプのデータが使用される場合、コピーする必要がありながら、異なる用途は、通常、strcpyの一般のmemcpyあります
コピーの異なる3)方法は、strcpyの必要長さを指定しないで、それは端閉鎖0までコピーする文字列に遭遇し、memcpyのは、その第三のパラメータに依存することは、複製の長さを決定します。
パラメータとしてX.構造
構造は、セット全体をパラメータとして渡すことができる変数、すなわち、すべてのメンバーの複数のセットです。構造体のメンバである場合、関数パラメータメモリオーバーヘッドのより初期化および割り当てプログラムの効率に影響を与える、重要であり得ます。だから、最良の方法は、構造体変数のアドレスを渡すことです。
実施例(book95.c)
/*
* 程序名:book95.c,此程序演示结构体作为函数的参数。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
};
// 对结构体赋值的函数
void setvalue(struct st_girl *pst);
int main()
{
struct st_girl queen; // 定义结构体变量
// 初始化结构体变量
memset(&queen,0,sizeof(struct st_girl));
setvalue(&queen); // 调用函数,传结构体的地址
printf("姓名:%s,年龄:%d\n",queen.name,queen.age);
}
void setvalue(struct st_girl *pst)
{
// 对结构体每个成员赋值
strcpy(pst->name,"武则天");
pst->age=28;
}
業績
XI、列挙とコミュニティ
2つのC言語のデータ構造もあります。私はその定義、20年を思い出すことができないとして列挙し、コミュニティ、あまりにも少ない2つのデータ構造のアプリケーションは少しように、私が使用していない、また導入決してしました。
十二、memsetの機能とBZERO
1、memsetの機能
memsetの機能は、メモリ空間の割り当て、特定の割り当てを実行するために使用されるメモリ空間の関数です。
<に含まstring.hの >ヘッダ・ファイル。
関数の宣言は次の通り:
void *memset(void *s, int v, size_t n);
sのメモリ空間のアドレスは、名前または配列のアドレスは、一般的に身体を構成されています。
vが塗りつぶし0が初期化され、満たされる値です。
nは充填されるバイト数です。
実際の開発では、プログラマの配列や構造が、前のセクションではmemset関数をクリアし、我々は何度も使用しています。
2、BZERO機能
BZERO機能はクリアされたメモリ空間です。
<に含まstring.hの >ヘッダ・ファイル。
関数の宣言は次の通り:
void bzero(void *s, size_t n);
sのメモリ空間のアドレスは、名前または配列のアドレスは、一般的に身体を構成されています。
nはゼロにされるバイト数です。
あなたがすることができたmemsetとBZEROを使用して、配列や構造体をクリアしたい場合は、何の違いは、プログラマの習慣を見ません。
XIII宿題
サンプルプログラムを作成し、このセクションは再びすべてのデモの知識を説明し、デモ・プログラムは、ご理解とマッピングを深めることができます。
XIVの著作権表示
C言語Technology Networkのオリジナルの記事、論文、著者と元にソースリンクを明記してくださいを再現。
出典:C言語テクノロジーネットワーク(www.freecplus.net)
著者:倫理コード農業
記事の誤字、またはコンテンツのエラー、またはその他の提案やコメントは、正しい私にメッセージをお願いした場合、どうもありがとうございました!!!