现实生活中一个事物,会有许多属性连接起来。而C语言引入一种构造数据类型——结构体
将属于一个事物的多个数据组织起来以体现其内部联系。
一、结构体类型的定义
结构体类型 是一种 构造类型,它是由若干成员组成的,每个成员可以是一个基本数据类型或者是一个构造类型。
结构体类型的名字 是由一个关键字 struct 和 结构体名 组成的
结构体定义的一般形式:
struct 结构体类型名
{
类型说明符1 成员名1;
类型说明符2 成员名2;
...
};
struct Stu
{int age;int ID;char name[10];
};
typedef 类型重命名
注意:
- struct 是结构体关键字,不能省略。结构体类型名可以省略,称为无名结构体。结构体成员可以是任何基本数据类型,也可以是数组和指针类型
- 定义结构体类型的语句要以 ; 结束,注意 {} 后的 ;
- 在编译时,系统不对定义的结构体类型分配内存空间
- 结构体类型与变量一样,作用范围也有全局和局部之分
二、结构体变量的定义和初始化
struct Point
{int x;int y;
}p1;
struct Point p2;
(1)先定义结构体类型,再定义结构体变量
struct Stu
{int age;char name[10];
};
int main()
{//struct 结构体类型的名称 结构体变量名的列表;struct Stu stu1,stu2;return 0;
}
(2)定义结构体类型的 同时 定义结构体变量
struct 结构体类型名
{
成员列表;
}结构体变量名的列表;
struct Point
{int x;int y;
}p1,pn;
(3)直接定义结构体变量
struct
{int age;int num;char sex;
}s1,s2;
初始化可以指定成员初始化
三、结构体成员的访问
1.结构体变量访问成员
结构体变量的成员是通过 点操作符( . ) 访问的。点操作符接收两个操作数
#include<stdio.h>
#include<string.h>
struct Stu
{int age;char name[10];
};
int main()
{struct Stu s;s.age = 18;strcpy(s.name,"zhangsan");printf("%s %d",s.name,s.age);return 0;
}
【结果】zhangsan 18
从调试上我们也可以看到
2.结构体指针访问指向变量的成员
#include<stdio.h>
struct Stu
{ char name[10];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",18};Print(&s);return 0;
}
如果只是打印成员,可以不传址
(建议传址,因为运行效率高)
四、结构体传参
#include<stdio.h>
struct S
{int data[100];int num;
};
struct S s = { {1,2,3},100 };
//结构体传参
void print1(struct S s)
{printf("%d\n",s.num);
}
//结构体地址传参
void print2(struct S *ps)
{printf("%d\n",ps->num);
}
int main()
{print1(s);print2(&s);return 0;
}
【结果 】100 100
根据上方代码 print2函数要好一些
因为函数传参的时候,参数是需要压栈的
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统系统开销比较大,所以会导致性能的下降
结构体传参的时候,要传结构体的地址