目录
、
1.结构体的类型
1.1结构的基础
结构是一些值的 集合 ,这些值被称为 成员变量 ,结构里面的成员变量的值可以是标量、数组、指针等不同类型的变量甚至是其他 结构体。每一个被定义类型的值成为结构中一个成员变量。例如下面这串代码:
struct tag (结构体名称)
{
member-list; (成员变量)
}variable-list; (被定义的变量)
1.2结构的声明
例如描述一个学生:
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//分号不能丢
Stu就是我们所定义的结构体的名称 ,上述代码在声明了结构体的同时定义了变量。
1.3结构体变量的定义和初始化
struct Point
{
int x;
int y; }p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
结构体的初始化可以在结构体后面进行,也可以利用结构体嵌套初始化,但不要忘记了在定义变量的同时赋初值用:
struct (结构体名称) (结构体定义的变量) = {x,y} ;{}中的x,y代表了你想要设定的成员变量的初始值,一定要按照变量的类型来设定初始值。
2.结构体类型的访问
2.1结构体变量访问成员
结构变量的成员是通过点操作符(.)进行访问的,点操作符接受两个操作数。例如:
我们看到 s 有成员 num 和 name,那么问题来了,如何访问s的成员呢?
struct S s;strcpy(s.name, "zhangsan");// 使用.访问name成员s.age = 20;// 使用.访问age成员
2.3结构体指针变量访问成员
有时候我们得到的不一定是一个结构体变量,有可能是指向结构体变量的指针,这时应该如何访问成员
一般有两种方法:1.采用 (*p).成员变量;2.采用p->成员变量 例子如下:
struct Stu
{
char name[20];
int age;
};
void print(struct Stu* ps)
{
printf("name = %s age = %d\n", (*ps).name, (*ps).age);
//使用结构体指针访问指向对象的成员
printf("\n");
printf("name = %s age = %d\n", ps->name, ps->age);
}
int main()
{
struct Stu s = { "xiaosan ", 20 };
print(&s);//结构体地址传参
return 0;
}
运行结果:
3.结构体传参
代码如下:
struct S {
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
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; }
函数print1代表给结构体传参,print2代表给结构体地址传参,那他们的区别在哪里?
我们来看看运行结果:
所以print1函数和print2函数的结果都是一样的
但我们应该选取哪个方法最优呢?
答案是:print2
原因:
函数传参的时候,参数是需要压栈的。(老铁如果不了解栈区的规则的话先去查找一下资料)
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结论:
所以说我们在利用结构体传参的时候,要传结构体的地址。