外贸网站建站h,舆情网站,交通局网站建设方案,玛伊网站做兼职加入要多少钱结构体的意义
问题#xff1a;学籍管理需要每个学生的下列数据#xff1a;学号、姓名、性别、年龄、分数#xff0c;请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构#xff1a;
学号#xff08;num#xff09;#xff1a; int 型姓名#xff08;…结构体的意义
问题学籍管理需要每个学生的下列数据学号、姓名、性别、年龄、分数请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构
学号num int 型姓名name) char [ ] 型性别sexchar 型年龄ageint 型分数scorefloat 型 思考如果有多个学生该怎么定义已学数据类型无法解决已学的数据类型需要定义好多变量不友好。
概述
正式 结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据被称为结构型数据的 “成员” 其描述了一块内存区间的大小及解释意义。通俗 结构体属于用户自定义的数据类型允许用户存储不同的数据类型。
在C语言中定义结构体的语法格式如下
struct 结构体名 {类型 成员1;类型 成员2;// ...
};其中结构体名是您自定义的结构体类型名称可以根据需求进行命名。成员1、成员2等表示结构体的成员变量每个成员都有自己的类型和名称。
定义结构体后可以使用该结构体类型创建结构体变量并访问结构体的成员。访问结构体成员的语法是使用结构体变量名后跟成员名中间使用点.进行连接。
结构体的使用 struct 结构体名 变量名 struct 结构体名 变量名 {成员1值成员2值…} 定义结构体时顺便创建变量这时候创建几个变量都可以中间用逗号隔开直接在创建的时候赋值也可以例如 struct student
{int num; //学号char name[16]; //姓名float score; //成绩
}stu5 {1002,lihua,89},stu6;如果只想给一部分数据赋值的话 struct 结构体名 变量名 {
.name cuiyi,
.num 111,
};下面是一个更完整的示例
#include stdio.h// 定义一个结构体
struct Person {char name[50];int age;float height;
};int main() {// 创建一个结构体变量struct Person person1;// 访问结构体的成员strcpy(person1.name, John);person1.age 25;person1.height 1.75;// 输出结构体的成员printf(Name: %s\n, person1.name);printf(Age: %d\n, person1.age);printf(Height: %.2f\n, person1.height);return 0;
}在上述示例中我们定义了一个名为Person的结构体它包含了姓名、年龄和身高三个成员变量。然后我们创建了一个名为person1的结构体变量并给它的成员赋值。最后使用printf函数输出结构体的成员值。
结构体数组
作用将自定义的结构体放入数组中方便维护语法 struct 结构体名 数组名[元素个数] {{}, {}, …{}} 示例
#includestdio.hstruct stu
{char name[16];int age;float score;
}s[3];int main()
{struct stu s[3] {{zhangsan,18,500},{lisi,18,530},{wangwu,18,550}};int i;for (i 0; i 3; i){printf(name%s, age%d, score%f\n,s[i].name,s[i].age,s[i].score);}return 0;
}结构体指针
作用通过指针访问结构体的成员语法struct 结构体名 *指针名;利用操作符-可以通过结构体指针访问结构体属性比如s.name 有一个指针 ps 指向 s 那么可以用 ps-name 代替 s.name
示例 结构体数组和结构体指针
#includestdio.hstruct stu
{char name[16];int age;float score;
}s[3];int main()
{struct stu s[3] {{zhangsan,18,500},{lisi,18,530},{wangwu,18,550}};struct stu *ps s;//定义一个指针指向结构体数组int i;for (i 0; i 3; i){printf(name%s, age%d, score%f\n,(*(psi)).name,(*(psi)).age,(*(psi)).score);}return 0;
}在上面的代码中一定要记得 (*(psi)) 才是一个大括号里面的值这样才能 .name .age .score 。
结构体嵌套结构体
含义 结构体中的成员可以是另一个结构体语法
struct 结构体名
{struct 结构体名 成员名;
};示例
#include stdio.h
#include string.hstruct person
{char name[16];int age;char sex;
};struct student
{struct person stu; float score;
};struct teacher
{struct person tea;char phone[12];
};int main(int argc, const char *argv[])
{struct student s;strcpy (s.stu.name,zhangsan);s.stu.age 12;s.stu.sex m;s.score 98;printf(name %s,age %d, sex %c, score %f\n, s.stu.name, s.stu.age, s.stu.sex, s.score);struct teacher t;struct teacher *p t;strcpy (p-tea.name, lisi);p-tea.age 54; //注意这里操作符 - 的用法p-tea.sex w;strcpy (p-phone, 13112341234);printf(name %s,age %d, sex %c, score %s\n, t.tea.name, t.tea.age, t.tea.sex, t.phone);return 0;
}上述代码中有一个部分用到了 p-tea.age 这种形式这是因为p是指针而 tea 只是一个普通变量所以从 tea 出发不能用 -只有指针才可以使用这个操作符。
结构体大小
字节对齐
含义 字节对齐主要是针对结构体而言的通常编译器会自动对其成员变量进行对齐以提高数据存取的效率。因为如果按照类型实际的大小来判断的话那么需要判断很多次这样对齐了以后有规律就不用判断了作用 平台原因移植原因不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常。性能原因数据结构尤其是栈应该尽可能地在自然边界上对齐。原因在于为了访问未对齐的内存处理器需要作两次内存访问而对齐的内存访问仅需要一次访问。
计算方法
自身对齐 这个数据类型大小是多少就是多少默认对齐 4字节有效对齐 在自身对齐和默认对齐之间选最小
规则地址 / 有效地址 必须是整数。
计算过程
把结构体里每个变量的类型的自身对齐默认对齐和有效对齐分别写出来以有效对齐为准写每个变量的地址最开始那个变量的地址肯定是0然后后面叠加注意在这个过程中要遵从**规则**比如图中的变量 b 本来地址应该是 1 但是因为 1 / 4 不是整数所以要扩充到 4 凑整那么这个时候 变量 a 的地址浪费了 1 2 3 这三个地址又因为 b 本身就是 4 个字节所以它的地址是 4 5 6 7。 c 和 d 因为都可以整除有效对齐所以每个都加 1 个字节就行最终看一下有效对齐最大的是 4 所以每个都要以 4字节 对齐则要在变量 d 的后面再补 2 个地址10 和 11 因为前面的 8 和 9 已经占了 2 个地址了还差 2 个地址凑够 4 个地址。得出结果结构体 A 的地址是 0~11 所以大小是 12 。
上述过程要注意能不能整除只能决定每个变量开头的地址具体要每一行的地址从开头的地址要写到几要看变量类型的 sizeof 是多少。比如有 double cc的开头地址是 8 那么这个变量占的字节就是 8 9 10 11 12 13 14 15 这八个字节。