C语言初识结构体
- 结构体类型的声明
- 结构体初始化
- 结构体成员访问
- 结构体传参
结构体的声明
结构
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体的声明
struct 结构体标签{
结构体成员列表;
}结构列表;
注:定义结构体实际上就是在声明,所以最后一定要有分号
举例
// struct 结构体关键字 Stu- 结构体标签 struct Stu -结构体类型
struct people{
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
}p1,p2;//p1,p2是两个全局的结构体变量
int main(){
// 创建结构体变量
struct people pe;//局部的
return 0;
}
使用typedef简化使用
typedef struct people{
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
}People;//People是typedef后struct people的别名
int main(){
// 创建结构体变量
People pe;//直接使用别名
return 0;
}
注意:使用了typedef那么创建结构体最后的分号前只能是别名,不能用来定义结构体变量。
结构体成员的类型
结构体的成员可以使变量,数组,指针,甚至是其他的结构体。
结构体变量的定义和初始化
struct Point{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
struct Point p3={x,y};//初始化:定义变量的同时赋初值
struct people pe = {"Tom", 20, "15885458520", "男"};
总结:1. 声明类型的时候初始化。 2. 直接定义结构体变量 3. 定义变量的同时初始化
嵌套使用
struct A{
int a;
char c;
char arr[20];
double d;
};
struct B{
char ch[10];
struct A a;
char *pc;
};
int main(){
char arr[10];
struct B b = {"hello", {100,'w',"world",2.22}, arr};
return 0;
}
结构体中的成员变量的类型可以是其他的结构体。初始化时使用的其他的结构体也使用{}进行初值的赋值。
结构体成员访问
1.结构体变量访问成员 结构体变量的成员是通过操作符(.)访问的。点操作符接受两个操作数。
int main(){
char arr[]="tian";
struct B b = {"hello", {100,'w',"world",2.22}, arr};
printf("%s\n",b.ch);
printf("%s\n",b.a.arr);
printf("%lf\n",b.a.d);
printf("%s\n",b.pc);
return 0;
}
2.结构体指针访问变量的成员 有的时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。(使用(->))
struct Stu{
char name[20];
int age;
};
void print(struct Stu* ps){
printf("name = %s age = %d\n",(*ps).name,(*ps).age);
//使用结构体指针访问指向对象的成员
printf("name = %s age = %d\n",ps->name,ps->age);
}
int main(){
struct Stu s = {"zhang", 20};
print(&s);
return 0;
}
结构体传参
struct Stu{
char name[20];
int age;
};
void print(struct Stu* ps){
printf("name = %s age = %d\n",(*ps).name,(*ps).age);
//使用结构体指针访问指向对象的成员
printf("name = %s age = %d\n",ps->name,ps->age);
}
void print2(struct Stu ps){
printf("name = %s age = %d\n",ps.name,ps.age);
}
int main(){
struct Stu s = {"zhang", 20};
print(&s);
print2(s);
return 0;
}
两种传参方式达到了同样的效果。但是真的没有区别吗?
使用指针访问不需要开辟新的空间。直接访问地址。时间空间上都占优。
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以导致性能的下降。
结论:结构体传参的时候,最好(要)传结构体的地址。