目录
一.结构体的定义
1.结构的基础知识
2.结构的声明
3.结构体变量的定义和初始化
二.结构体成员的访问
三.结构体的传参
- 结构是一些值的集合,这些值称为成员变量;
- 结构的每个成员可以是不同类型得变量;
基本格式:
struct tag //结构体关键字
{
member - list; //成员变量
}variable - list; //全局的结构体变量
注意:
- 成员变量之间用分号隔开,全局变量之间用逗号隔开;
- 结构体末大括号后必须加上分号(即使不写全局变量也要加上);
例,使用结构体描述一本书,需要:书名,书的价格,作者和国家。
//struct - 结构体关键字
//Book - 结构体标签
//struct Book - 结构体类型
struct Book {/* 成员变量 */char name[20]; // 定义一个结构体类型int price; char country[10]; char author[20];
} s1, s2, s3; // s1,s2,s3 是三个全局的结构体变量int main()
{struct Book s; // 创建结构体变量return 0;
}
用typedef进行定义:
typedef struct Book {char name[20];int price;char auther[10]; char country[20];
} Book;int main()
{Book s1; // 前面加typedef之后可以作为一个单独的类型来使用struct Book s2;// 不影响return 0;
}
使用大括号进行初始化:
typedef struct Book {/* 成员变量 */char name[20]; // 定义一个结构体类型int price; char country[10]; char author[20];
} Book;int main()
{Book s0 = {}; // 使用大括号初始化Book s1 = {"CSDN", 20, "CHINA", "CSDN"};Book s2 = {"活着", 30, "中国", "余华"};return 0;
}
通过点操作符(.)进行访问,例:
struct Book {/* 成员变量 */char name[20]; // 定义一个结构体类型int price; char country[10]; char author[20];
} s1, s2, s3; // s1,s2,s3 是三个全局的结构体变量int main()
{struct Book s={"活着“,30,"中国","余华"};printf("%s %d",s.name,s.price); //.操作符进行访问
}
打印结果为:余华 30
传参有两种形式:
- 传结构体(使用结构体接收);
- 传地址(使用结构体指针接收);
1.结构体传参
typedef struct Book {char name[20];int price; char country[10];char auther[20];
} Book;void print_by_s(Book tmp) //结构体为临时变量
{printf("书名: %s\n", tmp.name);printf("价格: %d\n", tmp.price);printf("国家: %s\n", tmp.country);printf("作者: %s\n", tmp.auther);
}int main()
{Book s1 = {"活着", 30, "中国", "余华"}; // 使用大括号初始化/* 打印结构体数据 */print_by_s ( s1 ) ; // 传结构体return 0;
}
2.结构体指针传参
typedef struct Book {char name[20];int price; char country[10];char auther[20];
} Book;void print_by_s(Book *tmp) //结构体指针
{printf("书名: %s\n", tmp.name);printf("价格: %d\n", tmp.price);printf("国家: %s\n", tmp.country);printf("作者: %s\n", tmp.auther);
}int main()
{Book s1 = {"活着", 30, "中国", "余华"}; // 使用大括号初始化/* 打印结构体数据 */print_by_s ( &s1 ) ; // 传结构体的地址return 0;
}
相比第一种传结构体,传结构体的地址其实更好一些,这是因为:
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。 并且,传地址效率高,方便修改,也不用再拷贝数据,所以首选传结构体的地址。
本篇到此结束 ,码文不易,还请多多支持哦~