一、结构体的定义
什么是结构体?
数组是相同元素的集合,结构体可以是不同类型的集合。
(一)结构体的声明
以下示例,即声明了一个结构体,也创建了一个结构体variable_list。
struct tag //结构体类型是struct tag
{
member_list; //成员变量列表
}variable_list; //变量列表,注意要有分号
注意:区分创建一个结构体和对结构体类型重命名(typedef)。
struct stu
{
char name[20];
int age;
char sex[5];
char id[20];
}S1;
下面这个代码是对struct stu类型重命名为stu类型。
typedef struct stu
{
char name[20];
int age;
char sex[5];
char id[20];
}stu;
stu S1;
(二)结构体成员的类型
成员类型:标量;数组;指针;甚至是其他结构体。
struct school
{
char name[10];
int num;
};
struct stu
{
char name[20];
int age;
int *p;
struct school sc;
};
(三)结构体变量的定义和初始化
- 在结构体定义时就创建结构体变量并对其初始化,这个结构体变量就是全局变量。
struct school
{
char name[10];
int num;
}sc1 = {"NY",96};
- 定义之后,再初始化,注意结构体成员初始化的顺序。
按照顺序依次初始化:
struct stu
{
char name[20];
int age;
int *p;
struct school sc;
};
int main()
{
struct stu s1 = { "Xiaoming",12,NULL,{"NY",96} };
return 0;
}
依靠.成员名进行初始化:
struct stu
{
char name[20];
int age;
int *p;
struct school sc;
};
int main()
{
struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };
return 0;
}
二、结构体成员的访问
注意:对结构体的数组成员进行访问时,传递的是数组首元素地址。
struct stu
{
char name[20];
int age;
int *p;
struct school sc;
};
int main()
{
struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };
s1.age = 10;
strcpy(s1.name, "Xiaohong");
s1.name[0] = 'L';
return 0;
}
结构体地址可以使用(*p).
也可以使用p->
。
struct stu
{
char name[20];
int age;
int *p;
struct school sc;
};
int main()
{
struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };
//s1.age = 10;
//strcpy(s1.name, "Xiaohong");
//s1.name[0] = 'L';
struct stu* p = &s1;
p->age = 10;
p->name[0] = 'L';
return 0;
}
三、结构体传参
注意:结构体传参要传结构体地址,传变量只会创建临时变量,出函数,临时变量销毁,不会对原结构体变量产生影响。另外,结构体过大,创建临时变量会导致系统开销过大。
struct stu
{
char name[20];
int age;
int *p;
struct school sc;
};
void print(struct stu* p)
{
printf("%d", p->age);
}
int main()
{
struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };
struct stu* p = &s1;
print(p);
return 0;
}