结构体类型声明
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构的声明:
12345 | struct tag{ member-list;}variable-list; |
struct:结构体关键字tag:结构体标签struct tag:结构体类型member-list:结构体成员variable-list:变量列表
例如描述一个学生:
——名字、年龄、电话、性别
12345678910111213 | struct Stu{ char name[20]; short age; char tele[12]; char sex[5];}s1,s2,s3;//s1,s2,s3是3个全局的结构体变量(尽量少使用) int main() { struct Stu s;//s是局部的结构体变量 return 0;} |
s1,s2,s3是3个全局的结构体变量(尽量少使用)s是局部的结构体变量
123456789101112 | typedef struct Stu{ char name[20]; short age; char tele[12]; char sex[5];}Stu; int main() { Stu s2; return 0;} |
typedef struct Stu{...}Stu意思是把struct Stu重新取名字叫Stu。
有关typedef:参见
结构体成员的类型
可以是标量、数组、指针或其他结构体
结构体变量的定义和初始化
12345678910111213 | typedef struct Stu{ char name[20]; short age; char tele[12]; char sex[5];}Stu; int main() { Stu s1 = {"张三",20,"18888888888","男"}; struct Stu s2 = {"李四",99,"12345678900","女"}; return 0;} |
123456789101112131415161718192021222324 | 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[] = "def"; struct T t = {"abc",{100,'w',"hello world",333.333},arr}; printf("%s\n",t.ch); printf("%s\n",t.s.arr); printf("%lf\n",t.s.d); return 0;} |
打印的结果是:
123 | abchello world333.333000 |
结构体成员的访问
结构体变量访问成员,是通过点操作符(.)访问的。
结构体传参
下例打印结构体数据:
123456789101112131415161718192021 | typedef struct Stu{ char name[20]; short age; char tele[12]; char sex[5];}Stu; void print1(Stu s){ printf("name : %s\n",s.name); printf("age : %d\n",s.age); printf("telephone : %s\n",s.tele); printf("sex : %s\n",s.sex);} int main() { Stu s1 = {"张三",20,"18888888888","男"}; print1(s1); return 0;} |
或使用箭头操作符
1234567891011121314151617181920 | typedef struct Stu{ char name[20]; short age; char tele[12]; char sex[5];}Stu; void print2(Stu* ps){ printf("name : %s\n",ps->name); printf("age : %d\n",ps->age); printf("telephone : %s\n",ps->tele); printf("sex : %s\n",ps->sex);}int main() { Stu s1 = {"张三",20,"18888888888","男"}; print2(&s1); return 0;} |
print2的函数性能优于print1,直接通过指针,可以节约内存空间。