C语言结构体

197 阅读3分钟

结构体基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构体类型的声明 对一本书的描述: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; }