结构体
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
//struct--结构体关键字 Stu--结构体标签 struct Stu--结构体类型
struct
Stu
{
char
name[20];
int
age;
char
sex[5];
char
num[20];
}s1,s2,s3;
//s1,s2.s3是结构体全局变量,一般不使用
int
mian()
{
struct
Stu
s;
//结构体局部变量
return
0;
}
当然,也可以将结构体类型改名。
typedef
struct
Stu
{
char
name[20];
int
age;
char
sex[5];
char
num[20];
}
Stu
;
//将struct Stu改名为Stu,Stu是类型
int
main()
{
Stu
s;
return
0;
}
结构体的初始化
typedef
struct
Stu
{
char
name[20];
int
age;
char
sex[5];
char
num[20];
}
Stu
;
//将struct Stu改名为Stu
int
main()
{
Stu
s1 = {
"李四"
,14,
"女"
,
"13423"
};
struct
Stu
s2 = {
"张三"
,14,
"男"
,
"1323"
};
return
0;
}
整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
s1.name找到s1中name[10]的首地址。
嵌套式的结构体
struct
S
{
int
a;
char
c;
char
arr[20];
double
d;
};
struct
T
{
char
ch[10];
struct
S
s;//嵌套了另一个结构体
char
* pc;
};
int
main()
{
char
arr[] =
"hello bit"
;
struct
T
t = {
"hehe"
,{100,
'w'
,
"hello world"
,3.14},arr };
printf(
"%s\n"
, t.ch);
//hehe
printf(
"%s\n"
, t.s.arr);
//hello world
printf(
"%lf\n"
, t.s.d);
//3.140000
printf(
"%p\n"
, t.pc);
//arr的地址
printf(
"%p\n"
, arr);
//arr的地址
printf(
"%s\n"
, t.pc);
//hello bit
printf(
"%s\n"
, arr);
//hello bit
return
0;
}
结构体嵌套体中不能出现自身,编译提示 struct STUDENT 定义未完成。为了保证不发生自身 嵌套 ,A 结构体中如果包含 B 结构体类型(非指针)成员,则 B 结构体必须在 A 之前定义
结构体的传参和访问
typedef
struct
Stu
{
char
name[20];
int
age;
char
sex[5];
char
num[20];
}
Stu
;
void
print1(
Stu
s
)
{
printf(
"%s\n"
,
s
.name);
printf(
"%d\n"
,
s
.age);
printf(
"%s\n"
,
s
.sex);
printf(
"%s\n"
,
s
.num);
}
void
print2(
Stu
*
ps
)
{
printf(
"%s\n"
,
ps
->name);
printf(
"%d\n"
,
ps
->age);
printf(
"%s\n"
,
ps
->sex);
printf(
"%s\n"
,
ps
->num);
}
int
main()
{
Stu
s1 = {
"李四"
,14,
"女"
,
"13423"
};
struct
Stu
s2 = {
"张三"
,14,
"男"
,
"1323"
};
print1(s1);
print2(&s2);
return
0;
}
访问
结构体变量-- .
结构体地址-- ->
前置++/-- < -> / .(优先级)
解引用得到变量(s1)/变量(s1),将所有s1成员值赋予对应s2,s3成员
注意:(void*)&s1 == (void*)s1.name是地址相等,&s1 和 s1.name 是不同类型指针。例如 scanf("%s", s1.name); 不能写成 scanf("%s",&s1);
传参
函数传参的时候,传参是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
结论:结构体传参的时候,要传结构体的地址。
自定义结构体
typedef
struct
Stu
{
char
* pc;
int
age;
char
sex[5];
char
num[20];
}
Stu
;
void
print1(
Stu
s
)
{
printf(
"%s\n"
,
s
.pc);
printf(
"%d\n"
,
s
.age);
printf(
"%s\n"
,
s
.sex);
printf(
"%s\n"
,
s
.num);
}
void
print2(
Stu
*
ps
)
{
printf(
"%s\n"
,
ps
->pc);
printf(
"%d\n"
,
ps
->age);
printf(
"%s\n"
,
ps
->sex);
printf(
"%s\n"
,
ps
->num);
}
int
main()
{
char
arr[20] = {0};
char
arr1[20] = { 0 };
int
a = 14;
scanf(
"%s%s"
, &arr,&arr1);
Stu
s1 = { arr ,a,
"女"
,
"13423"
};//arr传的是地址,要用指针存储。
struct
Stu
s2 = { arr1,14,
"男"
,
"1323"
};
print1(s1);
print2(&s2);
return
0;
}