网站开发需求分析中性能需求,wordpress 使用,wordpress菜单 标题属性,物联网和互联网的区别#x1f388;个人主页#xff1a;库库的里昂 #x1f390;CSDN新晋作者 #x1f389;欢迎 #x1f44d;点赞✍评论⭐收藏 ✨收录专栏#xff1a;C语言初阶 ✨其他专栏#xff1a;代码小游戏 #x1f91d;希望作者的文章能对你有所帮助#xff0c;有不足的地方请在评论… 个人主页库库的里昂 CSDN新晋作者 欢迎 点赞✍评论⭐收藏 ✨收录专栏C语言初阶 ✨其他专栏代码小游戏 希望作者的文章能对你有所帮助有不足的地方请在评论区留言指正大家一起学习交流 【前言】 书接上回上一章将初识指针讲完了相信只要你将该章节读完肯定对大部分的指针有了一定的了解并且你肯定对指针这一重要的知识点有了个基础的认识本章将写的内容时初阶的结构体当你将本认真的读完相信你肯定也会对什么是结构体、以及结构体的使用有更深的了解。所以系好安全带发出啦 一、结构体的声明、定义和初始化
1.结构的基本知识 结构是一些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量。 说到集合我们之前学习过的数组也是一种相同类型元素的集合但是结构体的值的类型可以是不同的。 我们知道在C语言中有一些基本的数据类型如 char int float long double 等等类型。 他们可以表示一些事物的基本属性但是当我们想表达一个事物的全部或部分属性时这时候再用单一的基本数据类型明显就无法满足需求了这时候C提供了一种自定义数据类型他可以封装多个基本数据类型这种数据类型叫结构体。 英文名称struct,可以使用struct关键词声明结构体。 规则 1、数据成员对齐规则结构(struct)(或联合(union))的数据成员第一个数据成员放在offset为0的地方以后每个数据成员的对齐按照#pragmapack指定的数值和这个数据成员自身长度中比较小的那个进行。 2、结构(或联合)的整体对齐规则在数据成员完成各自对齐之后结构(或联合)本身也要进行对齐对齐将按照#pragmapack指定的数值和结构(或联合)最大数据成员长度中比较小的那个进行。 3、结合1、2可推断当#pragmapack的n值等于或超过所有数据成员长度的时候这个n值的大小将不产生任何效果。 在C语言中可以定义结构体类型将多个相关的变量包装成为一个整体使用。在结构体中的变量可以是相同、部分相同或完全不同的数据类型。在C语言中结构体不能包含函数。在面向对象的程序设计中对象具有状态属性和行为状态保存在成员变量中行为通过成员方法函数来实现。C语言中的结构体只能描述一个对象的状态不能描述一个对象的行为。 2.如何声明一个结构体类型
首先要使用结构体就必须声明创建 一个结构体类型就必须用到结构体关键字struct
其中tag为结构体标签用来区分不同的结构体类型。struct tag表示结构体类型声明完结构体后就可以用该类型来创建变量了。member-list为成员列表它是结构体所包含的基本的结构类型。variable-list表示变量列表这个列表可写可不写写了就代表你用上面所创建的结构体类型定义了一个该类型的变量没写则表示你仅仅只创建了一个结构体类型。
struct tag
{member-list;
}variable-list;
描述一个学生
代码示例
typedef struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}Stu//分号不能丢 这段代码表示声明了一个结构体类型名为struct stu成员就是不同类型的成员变量。 注意: 1.若结构体声明是在mian函数之外的那么列表后创建的结构体变量是一个全局变量。2.结构体成员变量也可以是另一个结构体类型这种用法被称为嵌套结构体。3.在结构体声明结束的时候千万不要忘记{}后面是有一个的。 3.结构成员的类型 结构的成员可以是标量、数组、指针甚至其他是结构体。 小知识 在C语言中枚举类型、字符型和各种整数的表示形式统一叫做标量类型。 当在C表达式中使用标量类型的值时编译器就会自动将这些标识符转换为整数保存。 这种机制的作用是在这些标量类型上执行的操作与整型上执行的操作完全一样。 4. 结构体变量的定义和初始化 声明完结构体类型就可以用它来定义和初始化结构体变量了。 注意 结构体初始化与数组一样需要用{} 代码示例
#includestdio.h
struct grade
{double math;double english;
};
struct student
{char name[20];//姓名int age;//年龄char sex[5];//性别char id[20];//学号struct grade;//成绩(这是一个嵌套结构体类型)
};
int main()
{//定义、初始化结构体类型struct student ly {王二, 23, 男, 2117305789, {98.5, 66.0}};return 0;
} 不知道大家在用结构体类型定义一个变量时有没有觉得结构体的类型名太长了。其实可以通过typedef来重定义结构体的类型名如下所示 typedef struct student
{char name[20];//姓名int age;//年龄char sex[5];//性别char id[20];//学号struct grade;//成绩(这是一个嵌套结构体类型)
}stu; 注意这里的stu并不是创建的变量而是对于struct student的重命名。之后我们既可以用stu来创建变量也可以用struct student来创建。 二、结构体成员的访问 1.结构体变量访问成员 结构变量的成员是通过点操作符.访问的。点操作符接受两个操作数。 例如 我们可以看到 s 有成员 name 和 age 那我们如何访问s的成员
代码示例
struct S s;
strcpy(s.name, zhangsan);//使用.访问name成员
s.age 20;//使用.访问age成员
2.结构体指针访问指向变量的成员 有时候我们得到的不是一个结构体变量而是指向一个结构体的指针。 那该如何访问成员
代码示例
#includestdio.h
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;
} 三、结构体传参 结构体做函数参数有传递结构体和传地址 代码示例
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 函数哪个好些 答案是首选print2函数。 原因 函数传参的时候参数是需要压栈的。 如果传递一个结构体对象的时候结构体过大参数压栈的的系统开销比较大所以会导致性能的下降。 结论 结构体传参的时候要传结构体的地址。 今天的初阶结构体就分享到这里啦期待博主下一篇文章吧