返回

【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;
}

【C语言有这个就够了】六.结构体_初始化

栈的特点:先进后出

插入一个元素:压栈

删除一个元素:出栈

总结:结构体传参的时候,要传结构体的地址




特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
10.11 2023-02-13 06:26:48