一、结构体的声明
结构是一些值的集合,这些值成为成员变量。结构的每个成员可以是不同类型的成员
结构体的成员可以是标量、数组、指针,甚至是其他结构体。
1.1结构体的声明
struct stu
{
char name[20];//姓名
int age;//年龄
char sex[5];//性别
char id[20];//学号
};//分号不能丢
struct是定义结构体的关键字,stu是定义结构体取得一个名字,也可以省略,大括号里面是结构体的成员,定义结构体是一条语句需要加分号
1.2结构体变量的定义和初始化
struct stu
{
char name[20];//姓名
int age;//年龄
char sex[5];//性别
char id[20];//学号
}S;//声明类型的同时定义变量S
struct stu a;//也可这样用该类型定义变量a
struct stu b={
"张三",18,"男","1314"};//初始化:定义变量的同时赋值
stuct point
{
int x;
int y;
struct stu c;//结构体嵌套
}p={
4,3,{
"丽丽",19,"女","520"}};//结构体嵌套初始化
二、结构体成员的访问
- 结构体成员访问
结构体变量的成员访问是通过点操作符(.)访问的。点操作符接受两个操作数
struct stu
{
char name[20];//姓名
int age;//年龄
};
struct stu S;
S的成员有name和age;那如何访问成员?
#include <stdio.h>
#include <string.h>
struct stu
{
char name[20];//姓名
int age;//年龄
};
struct stu S ;
int main()
{
S.age = 20;//使用.访问age成员
strcpy(S.name, "张三");
printf("%d %s", S.age, S.name);
return 0;
}
对于结构体字符串的赋值,不能直接赋值,如果我们直接使用 S.name = “李华” 这样的赋值语句来给一个结构体变量 S 的成员 name 赋值,实际上是将一个字符串常量的地址赋值给了指针 S.name,而结构体成员与指针有本质的不同,不能直接进行赋值操作。 如果要给结构体变量
S 的成员 name 赋值,可以使用 strcpy 函数来实现。
- 结构体指针访问指向变量的成员
#include <stdio.h>
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 = {
"zhangsan",20 };
printf(&s);//结构体地址传参
return 0;
}
结构体指针访问成员有两种访问形式,一种是.操作符访问成员,一种是->访问成员
三、结构体传参
#include <stdio.h>
struct stu
{
int data[1000];
int num;
};
struct stu s = {
{
1,2,3,4},1000 };
//结构体传参,传值
void print1(struct stu s)
{
printf("%d\n", s.num);
}
//结构体传参,传址
void print2(struct stu* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);//结构体地址传参
print2(&s);
return 0;
}
结构体传参支持传值和传址,由于函数传参的时候,是需要压栈的,传值的时候,形式参数是实际参数的临时拷贝,会在内存上开辟一块空间,即压栈,如果结构体过大,会导致压栈的系统开销比较大,从而导致性能下降,而传地址占的空间就很小,所以对比以上两种传参方式,首选传址
结论:结构体传参的时候,要传结构体的地址。