结构struct
是一些值的集合
,这些值称为成员变量
。结构的每个成员可以是不同类型的变量。
学生
结构体struct Stu
{
char name[20];
int age;
char gender[5];
int hight;
}s1,s2,s3;
注意}s1,s2,s3;
最后有分号
.
main
外部定义全局变量结构体struct Stu s5;
main
内部定义局部变量结构体int main()
{
struct Stu s4;
return 0;
}
结构的成员可以是标量、数组、指针,甚至是其他结构体
struct Point
{
int x;
int y;
};
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
int hight;//身高
};
struct S
{
char c;
struct Point p;
double d;
char str[20];
};
//struct S ss = { 'x', {100, 200}, 3.14, "hello"};
struct S ss = {.d=3.14, .c = 'x', .p.x =100};
printf("%c %d %d %lf %s\n", ss.c, ss.p.x, ss.p.y, ss.d, ss.str);
struct Point p = {10, 20};
struct Stu s = {"zhangsan", 20, "男", 180};
printf("x=%d y=%d\n", p.x, p.y);
printf("%s %d %s %d\n", s.name, s.age, s.sex, s.hight);
x 100 0 3.140000
x=10 y=20
zhangsan 20 男 180
结构变量的成员是通过点操作符(.)
访问的。点操作符接受两个操作数
struct S
{
char name[20];
int age;
};
int main()
{
struct S s = {.age=20, .name = "Z"};
printf("%s %d\n", s.name, s.age);
s.age = 21;
//*char*
//s.name = "zhangsanfeng";//err
strcpy(s.name, "QQ");
printf("%s %d\n", s.name, s.age);
return 0;
}
Z 20
QQ 21
注意使用了strcpy(s.name, "QQJ");
.
传值
调用 和 传地址
调用
函数传参
的时候,参数是需要压栈
的。
如果传递一个结构体对象的时候,结构体过大
,参数压栈
的的系统开销比较大
,所以会导致性能下降
。
结构体传参的时候,要传结构体的地址。
struct S
{
int data[1000];
char buf[100];
};
//结构体变量.结构体成员名
//结构体指针->结构体成员名
void print1(struct S ss)
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", ss.data[i]);
}
printf("%s\n", ss.buf);
}
void print2(struct S* ps)
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", ps->data[i]);
}
printf("%s\n", ps->buf);
}
int main()
{
struct S s = { {1,2,3} , "hello world"};
print1(s);//传值调用
print2(&s);//传址调用
return 0;
}
1 2 3 0 0 0 0 0 0 0 hello world
1 2 3 0 0 0 0 0 0 0 hello world