结构体(1)

发布于:2024-06-04 ⋅ 阅读:(41) ⋅ 点赞:(0)

结构体:

记录班级的学生的信息:
姓名 
   数组 
   char name[30][100]; //
性别
   char sex[30]; // 0 1
年龄
   int age[30];
学号 
   int sno[30];

打印 小明 同学 信息


c语言 --- 提供了一种方式,可以让用户自定义数据类型 :
构造一个数据类型 --就叫学生类型 

提供一种可以让程序员自定义数据类型的方式

目的:用来解决 一些 复杂的数据类型问题

结构体定义:

//构造一个结构体类型 --- 声明结构体 
struct 结构体名

    成员列表
};

语法:
  1.struct    //结构体 类型 关键字 
  2.结构体名  (变量名)
             //表明这个结构体类型的 名称 
             //student 
  3.成员列表
            //来描述结构体类型中 具体的一些数据 
            //成员变量 
            // char name[20]; 
            // char sex;
            // int age;
            // int sno;
            // float score;
 4.最后结束时 } 后面,注意要有一个分号 

思路:
   构造出 数据类型 之后,
   可以,
   定义变量
   定义数组
   定义指针 ... (因为现在的结构体相当于一个数据类型)

结构体变量初始化:

struct student s = {"xiaoMing",0,1110,99.5} ; //初始化 ,需要按照 成员列表的顺序,依次初始化 
                                   //成员与成员之间的初始化的值,用逗号隔开
                                   //s变量中,存储的是某一个学生的信息 

如果变量是一个数组(一维或者二维),则里面继续用大括号隔开

                                                             score↓

例:成员int score[30]->{"xiaoMing",0,{1,2,……29,30},1110,99.5}

声明结构体类型方式:

1. 方式1
 先声明类型 后定义变量 
 struct student
 {
  ...
 };//声明类型 
 
 struct student s; //定义变量  

2. 方式2 
  声明类型的同时定义变量 
   struct student
 {
  ...
 }s;//声明类型 并 定义变量 
 

3. 方式3 
  声明类型的同时,定义变量,但是结构体名,可以省略   
 struct
 {
  ...
 }s;//声明类型 并 定义变量 (该写法省略了结构体名,但写了变量名,这种写法无法继续定义变量,因为没有结构体名)

一般第一种用的多

结构体特点:

  1.成员变量 一般是不同类型 //表示不同的含义 
  2.对于成员变量的访问
   只能通过 . (成员运算符),逐个访问
   不能通过类似 数组下标的方式,进行逐个遍历 

.运算和->运算访问成员变量:

  . //成员运算 
方法: 
 结构体变量名.成员变量名   
 -> //指针的结构体成员运算 
方法:
 结构体类型指针->成员变量名 

.运算前面接的是结构体但变量,而->接的是指针,两种方式皆是访问成员变量的值,

而不是地址

注意:

  1.同一类型的结构体变量间 是可以相互赋值的
  2.通过结构体类型的指针 也可以访问到结构体成员 
    -> 
  3.结构体类型 ,既可以做函数形参,也可以做函数返回值类型 

重要:内存对齐:

结构体对齐规则:

1.对于成员变量,各自在自己的自然边界上对齐

2.//32位的平台   
  //如果成员变量有超过4字节 ,按照4字节对齐
  //如果成员变量没有超过4字节的,则按成员变量中最大对齐 

3.//64位的平台
  //如果成员变量超过4字节的,按照最大的成员对齐 
  //如果成员变量没有超过4字节的,则按成员变量中最大对齐

也就是说,不管是32位还是64位,成员变量都先按照自然边界对齐,不超过四字节,结构体按照最大的成员变量对齐,超过四字节,在32位平台上,最大为四字节,而在64位平台上依然按照最大的成员变量对齐(如long 8字节)