一、结构体类型声明
1.1 结构体基础知识
什么是结构体?
结构体是一些值的集合,值为成员变量,成员变量可以是不同类型的变量。
1.2 结构体声明
struct Stu{
char name[20];
int age;
int sex;
} s1,s2,s2 ;
// s1,s2,s3 是通过struct Stu类型创建的变量
int main()
{ // struct Stu 一起写,不能随便省略 struct ,struct Stu 才是结构体类型
struct Stu s4; // s4 是局部变量
}
还有另一种写法:
typedef struct Stu Stu;
Stu s1,s2;
// typedef 作用是类型重定义,将 struct Stu 的作用重命名为 Stu .
typedef struct Stu {
char name[20];
int age;
int sex;
} Stu;
1.3 结构体成员的类型
结构体的成员可以是标量、数组、指针,甚至是其他结构体。
struct exam{
int a;
int a[10];
int* = &b;
} ss;
1.4 结构体的定义和初始化
结构体的初始化和数组类似,用一个大括号包裹。
struct Stu
{
char name[20];
int age;
} s1 = {"ddd",20}; //初始化变量 s1
struct Stu su = {"zhnagsan",18}; //初始化变量su
结构体还有个高级用法:嵌套初始化
struct point {
int x;
int y;
};
struct Node
{
int data;
struct point p;
struct Node* next;
} n1 = {10,{5,6},NULL};
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
二、结构体的成员访问
- 结构体变量访问成员
结构体成员是通过点操作符(.)访问的。它接受两个操作数
#include<stdio.h>
struct point {
int x;
int y;
};
struct ss {
char name[23];
int age;
int sex;
struct point s;
};
void print(struct ss rt)
{
printf("%s\n",rt.name);
printf("%d\n",rt.age);
printf("%d\n",rt.sex);
printf("%d\n",rt.s.x);
}
int main()
{
struct ss rt = { "zhangsan",18,1,{10,20} };
print(rt); // 传参给函数print
return 0;
}
- 结构体指针访问成员
结构体指针访问使用(->)操作符
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};
print(&s);//结构体地址传参
return 0;
}
三、结构体传参
#include<stdio.h>
struct ss {
char name[20];
int age;
};
// 结构体传参
void print1(struct ss s){
printf("%s\n", s.name);
}
// 结构体指针传参
void print2(struct ss* s){
printf("%s\n", s->name);
}
int main()
{
struct ss s = { "zhnagsan",29 };
print1(s); // 结构体传参
print2(&s);// 结构体指针传参
return 0;
}
结构体作为参数传给函数时,传本体还是地址?
答案是:传地址。
函数传参时,参数需要压栈。
传递结构体对象时,系统要在内存中开辟多个空间,造成浪费,
而传递地址时,直接通过地址找到结构体对象,性能提升,效率高。