目录
- 结构
- 结构的声明
- 结构成员的类型
- 结构体变量的定义和初始化
- 结构体成员的访问
- 结构体传参
结构
结构是一些值的集合,这些值被称为成员变量。之前说过数组是相同类型元素的集合。结构的每个成员可以是
不同类型
的变量,当然也可以是相同类型的。
我们在生活中会用姓名、性别、年龄、身份证号来描述人,用书名、作者、出版社、书号等等来描述书。像这些复杂的对象就需要用结构体来描述。
结构的声明
struct 名称
{
成员列表(一个或者多个);
}变量列表;
比如我们用结构体来描述一个学生,假设需要用到姓名,性别和年龄。
#include<stdio.h>
struct Stu
{
//成员变量,描述结构体对象的相关属性
char name[20];
char sex[5];
int age;
};
int main()
{
//int a;
struct Stu a; //struct Stu是类型
return 0;
}
struct Stu
{
//成员变量,描述结构体对象的相关属性
char name[20];
char sex[5];
int age;
}a,b,c; //这里的a,b,c是结构体变量,属于全局变量
typedef struct Stu
{
//成员变量,描述结构体对象的相关属性
char name[20];
char sex[5];
int age;
}Stu; //这里的Stu相当于把struct Stu重命名为Stu
int main()
{
//struct Stu a;
Stu a; //struct Stu是类型。现在由Stu替代。没有typedef,struct不能省略。
return 0;
}
结构成员的类型
结构成员可以是标量、数组、指针或者其他结构体。
struct A
{
int a;
char arr[10]; //数组
int* p; //指针
};
struct B
{
int b;
struct A b; //其他结构体
};
结构体变量的定义和初始化
//定义
//第一种方法
struct A
{
int x;
int y;
}a1; //定义a1
//第二种方法
struct A a2; //定义结构体变量a2
//初始化1
struct A a3 = {3,5};//定义变量的同时初始化。
//初始化2
struct A
{
int x;
int y;
}a4 = {3,5};
结构体成员的访问
通过点操作符访问
//1
#include<stdio.h>
struct A
{
int x;
int y;
}a4 = {3,5};
int main()
{
printf("%d %d\n", a4.x, a4.y);
return 0;
}
//2
#include<stdio.h>
struct Stu
{
char name[10];
char sex[5];
int age;
};
int main()
{
struct Stu a = { "小刘","男",19};
printf("%s %s %d\n", a.name, a.sex, a.age);
return 0;
}
有时候我们得到的不是结构体变量,而是一个指向结构体的指针
#include<stdio.h>
struct Stu
{
char name[10];
char sex[5];
int age;
};
void Out(struct Stu* pa)
{
printf("%s %s %d\n", (*pa).name, (*pa).sex, (*pa).age);
printf("%s %s %d\n", pa->name, pa->sex, pa->age);//使用结构体指针访问指向对象的成员
}
int main()
{
struct Stu a = { "小刘", "男", 19 };
Out(&a);
return 0;
}
结构体传参
#include<stdio.h>
struct A
{
int arr[100];
int num;
}a = { {1,2,3} , 5};
//结构体传参
void Out1(struct A a)
{
printf("%d\n", a.num);
}
//结构体地址传参
void Out2(struct A* pa)
{
printf("%d\n", pa->num);
}
int main()
{
Out1(a); //方法1
Out2(&a); //方法2
return 0;
}
首选方法2
原因:函数传参的时候,参数是需要压栈的。如果传递的结构体对象的时候,结构体太大的话,参数压栈的系统开销会比较大,很浪费内存,会导致性能下降。
所以结构体传参的时候,要传结构体的地址