【C语言有这个就够了】六.结构体
发布时间:2023-02-13 06:46:24 291 相关标签: # 信息
(一)结构体的声明
1.结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
2.结构的声明
struct tag
{
member-list; //成员列表
}variable-list;//变量列表
例如描述一个学生:
//struct 结构体关键字 Stu 结构体标签 struct Stu 结构体类型
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
int main()
{
struct Stu s; 相当于int a的书写形式
return 0;
}
truct Stu
{
char name[20];
int age;
char sex[5];
char id[20];
}s1,s2,s3;//是三个全局结构体变量
int main()
{
struct Stu s; //局部变量
return 0;
}
typedef struct Stu//typedef将类型重新命名为Stu
{
char name[20];
int age;
char sex[5];
char id[20];
}Stu;//是三个全局结构体变量
int main()
{
struct Stu s1; //局部变量
Stu s2;//也可以创建
return 0;
}
3.结构体的成员类型
结构的成员可以是标量、数组、指针,甚至是其他结构体
4. 结构体变量的定义和初始化
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; ////定义结构体变量p2
struct Point p3 = {x, y};//初始化:定义变量的同时赋初值。
给学生信息初始化:
typedef struct Stu//typedef将类型重新命名为Stu
{
char name[20];
int age;
char sex[5];
char id[20];
}Stu;//是三个全局结构体变量
int main()
{
struct Stu s1={"张三",20,"13089786654","男"};
Stu s2={"李四",60,"18889786654","男"};//再创建的同时初始化
return 0;
}
嵌套结构体该如何初始化?
#include
struct s
{
int a;
char c;
char arr[20];
double d;
};
struct t
{
char ch[10];
struct s m;
char* pc;
};
int main()
{
char arr[] = "hello world\n";
struct t n = { "hehe",{20,"abc","gaga",6.18},arr };//大括号中再套大括号
printf("%s\n", n.ch);//hehe
printf("%s\n", n.m.arr);//gaga
printf("%lf\n", n.m.d);//6.18
printf("%s\n", n.pc);//hello world
return 0;
}
注意:n.m.arr用的都是变量名,而不是结构名
(二)结构体成员访问
1.结构变量的成员是通过点操作符(.)访问的
2.指向一个结构体的指针(->)
实例见结构体传参。
(三)结构体传参
传变量
#include
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char gender[5];//性别
char id[20];//学号
}Stu;
void print(Stu tmp)
{
printf("name:%s\n",tmp.name );//注意此处用的是tmp而非s
printf("age:%d\n", tmp.age);
printf("gender:%s\n", tmp.gender);
printf("id:%s\n", tmp.id);
}
int main()
{
Stu s = { "李四",30,"男","168816881688" };
print(s);
return 0;
}
传地址
#include
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char gender[5];//性别
char id[20];//学号
}Stu;
void print(Stu tmp)
{
printf("name:%s\n", tmp.name);
printf("age:%d\n", tmp.age);
printf("gender:%s\n", tmp.gender);
printf("id:%s\n", tmp.id);
}
void print1(Stu* ps)
{
printf("name:%s\n", ps->name);
printf("age:%d\n", ps->age);
printf("gender:%s\n", ps->gender);
printf("id:%s\n", ps->id);
}
int main()
{
Stu s = { "李四",30,"男","168816881688" };
print1(&s);
return 0;
}
传地址更优
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的
下降。
注:压栈
#include
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 0;
int b = 0;
int ret = 0;
ret = Add(a, b);
return 0;
}

栈的特点:先进后出
插入一个元素:压栈
删除一个元素:出栈
总结:结构体传参的时候,要传结构体的地址。
文章来源: https://blog.51cto.com/u_15796276/5759328
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报