结构体声明
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构的声明
struct tag//struct-结构体关键字 tag-结构体标签 struct tag -结构体类型
{
member-list;
member-list;
member-list;//结构体类型
}variable-list;//variable-list为变量列表,分号不可省略
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。
结构体变量的定义和初始化
1、在定义结构体的同时定义结构体变量:将变量放在结构体定义的最后即可。
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义全局变量p1
2、只需要 stu1、stu2 两个全局变量,后面不需要再使用结构体名定义其他变量,那么在定义时也可以不给出结构体名。
struct{ //没有写 stu
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
3、用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
4、用typedef创建新类型
typedef struct
{
int a;
char b;
double c;
} Simple2;//Simple2为新的结构体类型
注:区别分号后的结构体类型和全局变量,左侧此时typedef将 struct Stu这个结构体类型重新定义类型名称为Stu。
结构体成员的访问
结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
typedef struct stu
{
char name [20];
short age;
char tele[12];
char sex[5];
}ent;//采用了typedef自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
void Print1(ent tmp)
{
printf("%s\n", tmp.name);
printf("%d\n", tmp.age);
printf("%s\n", tmp.tele);
printf("%s\n", tmp.sex);
}//
void Print2(ent* ps)
{
printf("%s\n", ps->name);
printf("%d\n", ps->age);
printf("%s\n", ps->tele);
printf("%s\n", ps->sex);
}
int main()
{
ent s = {"李四",20,"17395901964","男"};
Print1(s);//函数传参
Print2(&s);//函数传址
return 0;
}
两种方法对结构体成员进行访问,但是第一种是函数传参,因为形参tmp是实参s的一份临时拷贝,形参tmp又重新在内存中开辟一块新的空间,并且耗费时间对实参s进行复制,不建议使用。第二种是函数传址,传递了4/8个字节的空间。将& 运算符放在结构名称的前面,查找结构变量的地址,使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符。
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
总结:结构体传参的时候,要传结构体的地址。
当随着数组下标的不断增大,发生了越界,于是程序死循环了。
const修饰指针变量的时候:
1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。
2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。