结构体
结构体类型的声明
结构体的初始化
结构体成员访问
结构体传参
结构体基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体类型的声明
对一本书的描述:struct Book是结构体类型
struct Book
{
char name[20]; //书名
char author[20]; //作者
float price;//价格
};//分号不能丢
注意:结构体的成员类型可以是标量、数组、指针、其他结构体。
结构体的定义和初始化
有了结构体类型之后如何做到初始化结构体呢?
#include<stdio.h>
struct Book
{
char name[20];
char author[20];
float price;
};
int main()
{
//初始化,定义变量并赋值
struct Book b = { "谭浩强","C语言程序和设计",3.14 };
return 0;
}
在这里补充一下~
1、结构体定义全局变量和局部变量
#include<stdio.h>
struct Book
{
char name[20];
char author[20];
float price;
}b1,b2; //b1,b2 是全局变量---静态区
struct Point
{
int x;
int y;
}p1,p2; //p1 , p2是全局变量---静态区
int main()
{
struct Point p; //p是局部变量---栈区
//初始化,定义变量并赋值
struct Book b = { "谭浩强","C语言程序和设计",3.14 };
return 0;
}
2、typedef定义
typedef struct Stu
{
char name[20];
int age;
char id[20];
}Stu; //typrdef将struct Stu重定义用Stu来表示
//或者也可以这样
//typedef struct Stu Stu;
int main()
{
//那么可以这样来初始化
Stu s1 = { "张三",20,"4702200400" };
return 0;
}
结构体成员访问
两种点成员访问:
结构体名.成员名
#include<stdio.h>
struct Point
{
int x;
int y;
};
typedef struct Stu
{
char name[20];
int age;
char id[20];
}Stu;
//要放在结构体类型的后面
void print1(struct Stu s1)
{
printf("名字:%s 年龄:%d ID:%s\n", s1.name, s1.age, s1.id);
}
void print2(struct Point* p)//指针接收
{
printf("x:%d y:%d\n", (*p).x, (*p).y);
}
int main()
{
Stu s1 = { "张三",20,"4702200400" };
//struct Point* p = { 10,20 }; //err
struct Point p = { 10,20 };
print1(s1);
print2(&p);
return 0;
}
->成员访问
结构体指针名->成员名
#include<stdio.h>
typedef struct Stu
{
char name[20];
int age;
char id[20];
}Stu;
//要放在结构体类型的后面
void print1(struct Stu* s1)
{
printf("名字:%s 年龄:%d ID:%s\n", s1->name, s1->age, s1->id);
//指针接收另一种表示方式
//printf("名字:%s 年龄:%d ID:%s\n", (*s1).name, (*s1).age, (*s1).id);
}
int main()
{
Stu s1 = { "张三",20,"4702200400" };
print1(&s1);
return 0;
}
结构体传参
观察以下代码,print1和print2哪个方法更优?
#include<stdio.h>
struct Point
{
int x;
int y;
};
typedef struct Stu
{
char name[20];
int age;
char id[20];
}Stu;
//要放在结构体类型的后面
void print1(struct Stu s1)
{
printf("名字:%s 年龄:%d ID:%s\n", s1.name, s1.age, s1.id);
}
void print2(struct Point* p)
{
printf("x:%d y:%d\n", p->x, p->y);
}
int main()
{
Stu s1 = { "张三",20,"4702200400" };
//struct Point* p = { 10,20 }; //err
struct Point p = { 10,20 };
print1(s1);
print2(&p);
return 0;
}
print2更优。
原因:
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结构体里套结构体
在初始化的时候用{{},.....}的方式来做
打印的时候用: 结构体.结构体.成员名
结构体->结构体.成员名 来打印。
具体例子和解析如下:
#include<stdio.h>
struct S
{
int a;
char c;
double d;
};
struct T
{
struct S s; //嵌套结构体,s也要加上
char name[20];
int num;
};
void print(struct T* pt)
{
printf("%d %c %lf %s %d\n", pt->s.a, pt->s.c, pt->s.d, pt->name, pt->num);
}
int main()
{
struct T t = { {100,'c',3.14},"lisi",10 };
printf("%d %c %lf %s %d\n", t.s.a, t.s.c, t.s.d, t.name,t.num);
struct T* pt = &t;
printf("%d %c %lf %s %d\n", pt->s.a, pt->s.c, pt->s.d, pt->name, pt->num);
//函数调用方式打印
print(&t);
return 0;
}