1. 结构体的声明
结构是一些值得集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构的声明1:
struct tag
{
member-list;
}variable-list;
例如:
//struct为结构体关键字; Stu为结构体标签; struct Stu为结构体类型
struct Stu
{
//成员标签
char name[20];
short age;
char tel[12];
char sex[5];
}s1,s2,s3; //s1,s2,s3为变量列表,属于全局变量
int main()
{
struct Stu s; //创建结构体变量,属于局部变量
return 0;
}
一般来说,在程序里应该尽可能少的创建全局变量,所以结构体声明一般不创建结构体变量,而是通过创建局部结构体变量的方式来创建。代码应改为:
//struct为结构体关键字; Stu为结构体标签; struct Stu为结构体类型
struct Stu
{
//成员标签
char name[20];
short age;
char tel[12];
char sex[5];
};
int main()
{
struct Stu s; //创建结构体变量,属于局部变量
struct Stu s1;
struct Stu s2;
struct Stu s3;
return 0;
}
结构体声明2:
typedef struct tag
{
member-list;
}alias;
例如:
typedef struct Stu
{
char name[20];
short age;
char tel[12];
char sex[5];
}Stu; //此处加上typedef就是将结构体类型struct Stu直接命名为Stu
int main()
{
struct Stu s;
Stu s1; //使用typedef之后创建结构体变量可直接使用别名+变量名的形式创建
Stu s2;
Stu s3;
return 0;
}
通过以上声明可知:结构体的成员可以是标量、数组、指针,甚至是其它结构体.
2. 结构体变量的定义和初始化
结构体变量定义1:声明类型的同时定义变量p1(此时p1为全局变量)
struct Point
{
int x;
int y;
}p1;
结构体变量定义2:在主函数或其他函数内部定义结构体变量,此时为局部变量
struct Point p2;
结构体变量的初始化:结构体变量在创建的同时给它赋值叫做结构体变量的初始化。和数组初始化类似,结构体变量初始化也是采用大括号的形式,大括号内的内容根据结构体的声明成员列表形式来确定。例如:
typedef struct Stu
{
char name[20];
short age;
char tel[12];
char sex[5];
}Stu;
int main()
{
Stu s1 = { "张三",20,"16666666666","男" }; //结构体变量初始化
Stu s2 = { "李四",22,"18888888888","女" };
return 0;
}
再如:
typedef struct Stu
{
char name[20];
short age;
char tel[12];
char sex[5];
}Stu;
typedef struct T
{
char ch[10];
Stu s;
char* pc;
}T;
int main()
{
T t = {"hello", {"张三",20,"16666666666","男"}, NULL}; //嵌套结构体初始化
return 0;
}
3. 结构体成员的调用及传参
定义完结构体变量之后,调用结构体成员的方法有两种:
- 结构体变量.结构体成员
- 结构体变量指针->结构体成员
例如:创建两个打印结构体函数
void print1(Stu tmp)
{
printf("name:%s\n", tmp.name);
printf("age:%d\n", tmp.age);
printf("tel:%s\n", tmp.tel);
printf("sex:%s\n", tmp.sex);
}
void print2(Stu* tmp)
{
printf("name:%s\n", tmp->name);
printf("age:%d\n", tmp->age);
printf("tel:%s\n", tmp->tel);
printf("sex:%s\n", tmp->sex);
}
int main()
{
Stu s = {"张三",20,"16666666666","男"};
print1(s);
print2(&s);
return 0;
}
由于函数形参是实参的临时拷贝,所以print1函数会花费更多的空间和时间,因此,其性能更低。
函数传参的时候,参数是需要压栈(插入元素)的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结论:结构体传参的时候,要传结构体的地址