一、结构的基础知识
结构是一些值的集合,这些值称为成员变量结构的,每个成员可以是不同类型的变量。
二、结构的声明
struct tag
{
member-list;
}variable-list;
描述一个学生:
typedef struct Student
{
char name[20]; //姓名
int age; //年龄
char sex; //性别
char id[20]; //学号
}
Student;
三、结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
结构体变量的定义和初始化
有了结构体类型,如何定义变量。
struct Point
{
int x;
int y;
}p1;//结构体类型的同时定义变量p1。
struct Point p2;//结构体类型的同时定义变量p2。
// 初始化定义变量的同时赋初值。
struct Point p3 = {x,y};
struct Student // 类型声明
{
char name[20]; //名字
int age; //年龄
};
struct Student stu = {"张三", 20};// 结构体变量的初始化。
struct Node
{
int data;
struct Node *next;
}n1 = {10,{4,5},NULL};// 结构体嵌套的初始化。
struct Node n2 = {20,{5,6},NULL};// 结构体嵌套的初始化。
四、结构体成员的访问
结构体变量访问成员,结构变量的成员是通过点操作符( . )访问的.点操作符接受两个操作数。例:
struct Student
{
char name[20];
int age;
};
struct Student s;
如何访问s的成员?如下:
struct S s;
strcpy (s.name,"张三");
s.age=18; //使用.运算符访问结构体成员变量
- 结构体指针访问指向变量的成员,有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针
因此,我们需要使用->运算符来如何访问成员。
struct Student
{
char name[20];
int age;
};
void printf_student(struct Student *s)
{
printf("姓名:%s 年龄:%d\n",(*s)name,(*s).age);
//使用结构体指针访问成员变量
printf("姓名:%s 年龄:%d\n",s->name,s->age);
}
int main()
{
struct Student s={"张三",18};
printf(&s);
return 0;
}
五、结构体传参
#include<stdio.h>
struct Student
{
char name[20];
int age;
};
//结构体传参
void printf1(struct Student s)
{
printf("姓名:%s 年龄:%d\n",s.name,s.age);
}
//结构体地址传参
void printf2(struct Student *s)
{
printf("姓名:%s 年龄:%d\n",s->name,s->age);
}
int main()
{
struct Student s={"张三",18};
printf1(s);
printf2(&s);
return 0;
}
可见printf2函数好些,原因:
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销,比较大,会导致性能的下降
结论:结构体传参的时候要传结构体的地址。