------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
——————————————————————————————————————————————————————————————————
一、构造类型
概念:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。
二、定义结构体的方法
概念:由相同类型或不同类型的数据用构造方法构造起来
定义:struct 结构名 { 成员列表 };
代码:
三、结构体变量及定义方法
(1)先定义结构体,然后再定义结构体变量
注意:
1)结构体定义完成以后,计算机并不会给结构体分配内存空间
2)会在定义结构体变量后,分配存储空间
结构体变量定义格式:
struct 结构体名 结构体变量名;
代码如下:
(2)定义结构体的同时,定义结构体变量
(3)使用匿名结构体定义结构体变量
四、结构体变量中成员的访问方法
表示结构变量成员的一般形式是:
结构变量名.成员名
代码如下:
五、成员体变量的初始化
这里重点介绍字符数组和字符串指针的初始化方法
(1)先写字符数组初始化的代码
这种写法是错误的,相当于:
char name [ 20 ] ;
name="hehe";
而name是字符串的名字,是常量,常量是不可以改变的。所以会报错,解决代码如下:使用strcpy函数
(2)接下来写字符串指针的初始化代码
这样为什么可以呢?相当于如下代码:
char *name="123";
name="456";
指针是可以重新指向的。所以可以。
(3)stu.name占用多少个字节?字符串长度是多少?
sizeof ( stu.name ) =21;
strlen ( stu.name ) =9;
六、结构体变量存储原理
(1)先找对齐模数,是结构体中的基本数据类型中占用字节数最大的那个
(2)在计算结构体变量的中各个成员占用的字节和
示例代码如下:
(1)值为12。模数是4,然后对齐,每个数据的存储空间大小都是4,3个就是12。
(2)值为32
(3)值为28
七、结构体作用域
解析:局部结构体变量会覆盖全局结构体变量,因为局部变量中没有name这个属性,所以会报错。
解析:这个不报错,为什么呢?因为局部变量定义在了代码块内,影响不到代码块外创建的结构体变量,代码块外所创建的结构体变量是全局结构体的变量。
八、结构体数组
1、概念:结构数组的每一个元素都是具有相同结构类型的下标结构变量。
3、结构体定义的两种方式
(1)定义结构体的同时,定义数组
struct 结构名{
成员表列;
} 数组名 [ 数组长度 ] ;
(2)先定义结构体,后定义数组
struct Student stu [ 5 ] ;
九、结构体数组初始化和遍历
1、初始化
(1)定义的同时进行初始化
(2)先定义,后初始化,整体赋值
(3)先定义,后初始化,单个赋值
整体代码如下:
2、遍历
十、结构指针定义和初始化
1、概念:存放结构体变量地址的指针变量
2、定义:struct 结构名 *结构指针变量名 ;
3、注意点:
使用结构体指针变量取值时,很容易搞混间接取值的两种方法,多看看图片中的解析,不要弄混。
十一、结构体嵌套使用
1、概念:结构体定义中,结构体的成员又是另外一个结构体变量
2、注意事项:
(1)结构体定义中可以嵌套其他结构体类型的变量,不可以嵌套自己类型的变量
struct Date{
int year ;
int month ;
int day ;
}
1)以下是错误的:嵌套了自己类型的变量
struct Student{
char *name;
int age;
float score;
struct Student student;
}
2)以下是正确的:嵌套了其他结构体类型的变量
struct Student{
char *name;
int age;
float score;
struct Date date;
}
(2)可以嵌套自己类型的指针
struct Student{
char *name;
int age;
float score;
struct Student *student;
}
3、嵌套结构体进行初始化和访问
(1)结构体嵌套其他类型的结构体
(2)结构体嵌套自己类型的指针
十二、结构体变量及成员作为函数参数
实际上,不管是结构体变量作为函数参数,还是结构体变量的成员属性作为函数参数,都属于值传递。
一旦被调函数运行完毕,释放内存空间,被调函数的形参都会失效,在被调函数中对函数的操作,会在内存释放完毕后失效。
十三、结构指针作为函数参数
实际上,以结构指针作为函数参数实际上就是地址传递。
在被调函数中是对地址对应的数据进行操作,可改变地址对应的内容的值。及时被调函数释放内存,也不会影响结果。
代码如下: