コンテンツ
構造体メンバーのタイプ構造体のメンバーは、スカラー、配列、ポインター、またはその他の構造体にすることができます。
構造体にパラメータを渡すときは、構造体のアドレスを渡す必要があります。
1.1構造の宣言
C言語には多くの型があることを知っています:char short int long float double型ですが、これらの型は複雑なオブジェクトを表すことはできません
生徒について説明してください:名前、年齢、性別、学年...
構造の基本構造は、メンバー変数と呼ばれる値のコレクションです。構造体の各メンバーは、異なるタイプの変数にすることができます。
//结构体申明:
struct(关键字) tag(名字)
{
member-list;(成员变量)
}variable-list;(变量列表,可写可不写)
//申明一个学生结构体
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[8];//性别
float score;//成绩
}s1,s2,s3; //分号不能丢s1,s2,s3是通过struct Stu类型创建的变量
//s1,s2,s3是全局变量
int main()
{
struct Stu s4; //局部变量
}
struct Stuは構造体型であり、structを省略するだけでなく、typedef(型の再定義)を使用できます。
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[8];//性别
float score;
}Stu;//(对整个上面类型重新起名字,不能再创建列表)
int main()
{
Stu s6; //局部变量
}
構造体メンバーのタイプ構造体のメンバーは、スカラー、配列、ポインター、またはその他の構造体にすることができます。
1.2構造変数の定義と初期化
struct Point
{
int x;
int y;
}p1 = {10, 15};//定义变量p1并初始化
struct S
{
char c;
struct Point sp;
double d;
char arr[20];
};
int main()
{
struct Point p = { 100, 200 };//初始化
struct S ss = { 'w', {100,20}, 5.5, "hello"};
return 0;
}
2.1構造体メンバーへのアクセス
構造体変数のメンバーには、構造体メンバー演算子(。)を使用してアクセスします。
struct Point
{
int x;
int y;
}p1 = {10, 15};//定义变量p1并初始化
struct S
{
char c;
struct Point sp;
double d;
char arr[20];
};
int main()
{
struct Point p = { 100, 200 };//初始化
struct S ss = { 'w', {100,20}, 5.5, "hello"};
printf("%c\n", ss.c);//结构体对象.结构体成员
printf("%c\n", ss.sp.x,ss.sp.y);
printf("%c\n", ss.d);
printf("%c\n", ss.arr);
return 0;
}
2.2構造ポインタ(次のうちどれが良いか)
struct Point
{
int x;
int y;
}p1 = {10, 15};
struct S
{
char c;
struct Point sp;
double d;
char arr[20];
};
void print1(struct S s)//打印struct S类型的变量,s是一份临时拷贝
{
printf("%c\n", s.c);
printf("%d %d\n", s.sp.x, s.sp.y);
printf("%lf\n", s.d);
printf("%s\n", s.arr);
}
void print2(struct S* ps)//指针,传过来的是ss地址
{
printf("%c\n", ps->c);
printf("%d %d\n", ps->sp.x, ps->sp.y);
printf("%lf\n", ps->d);
printf("%s\n", ps->arr);
}
int main()
{
struct Point p = {100, 200};
struct S ss = { 'w', {100,20}, 5.5, "hello"};
//ss.c = 'b';可以改变量
//ss.sp.x = 1000;
//ss.sp.y= 2000;
//ss.d = 3.14;
//strcpy(ss.arr, "world");//strcpy字符串拷贝
print1(ss);//打印struct S类型的变量
print2(&ss);//拿到ss
return 0;
}
タイプstructSの変数の2つのコピーが作成され、パラメーターをスタックにプッシュする必要があります。構造体オブジェクトが渡されると、構造体が大きすぎ、パラメータスタッキングのシステムオーバーヘッドが比較的大きくなるため、パフォーマンスが低下します。
print2は過去のssアドレスのみを渡し、サイズは4/8バイトで、スペースを節約します
.structvariables.structメンバー
->構造体ポインタ->構造体メンバー
構造体にパラメータを渡すときは、構造体のアドレスを渡す必要があります。
3.1構造の宿題の練習
struct student
{
int num;
char name[32];
float score;
}stu;
下面的叙述不正确的是:( )
A.struct 是结构体类型的关键字
B.struct student 是用户定义的结构体类型
C.num, score 都是结构体成员名
D.stu 是用户定义的结构体类型名
A:正确,在C语言中需要自定义类型时,要用到struct关键字
B:正确:在C语言中,用struct定义的结构体,定义结构体类型变量时,需要用struct student
C:正确:结构体中的变量名称,称之为结构体的成员
D:错误:stu是定义的结构体类型变量,不是名称,如果想要让stu为结构体类型名称时,必须在结构体定义时添加 typedef关键字
因此:选择D
3.2次のプログラムの出力は次のとおりです。
struct stu
{
int num;
char name[10];
int age;
};
void fun(struct stu *p)
{
printf(“%s\n”,(*p).name);
return;
}
int main()
{
struct stu students[3] = {
{9801,”zhang”,20},
{9802,”wang”,19},
{9803,”zhao”,18}
};
fun(students + 1);
return 0;
}
main関数では、stu構造体タイプの配列studentが最初に定義されます。studentsは構造体の開始位置を指します。Students+ 1は配列の最初の要素を示します。したがって、funの正式なパラメーターは実際にはstudentsを指します。配列。の最初の要素なので、printはwangです