标签:字节 定义 C语言 char student 类型 结构
结构体
1、结构体的概念:由多个相同或不同的数据类型组成的集合,集合内有多个用来描述的属性。
2、结构体的声名:
typedef struct student{
成员属性列表;
}student_t;
声明的结构体类型是一个新的数据类型。
3、定义结构体类型的变量:
student_t stu; --------》 定义一个结构体类型的变量
student_t stu1; --------》 定义一个结构体类型的指针
student_t stu2[2]; --------》定义一个结构体类型的数组
student_t stu3[2]; --------》定义一个结构体类型的指针数组
student_t (*stu4)[2]; --------》定义一个结构体类型的数组指针
4、对结构体变量的初始化:
(1)、定义的同时进行初始化
student_t stu = {value1,value2,......................};
(2)、先定义,后初始化
student_t stu;
student_t *stu1 = &stu;
(3)、已经初始化的结构体,对另一个相同类型的结构体进行初始化(要求两个结构体类型一致)
student_t stu;
student_t *stu1 = &stu;
student_t stu5 = stu;
5、结构体中成员的访问:
普通的结构体类型变量使用 "."
格式:
结构体变量名 . 成员名;
结构体指针类型变量使用 "->"
格式:
结构体变量指针 -> 成员名;
6、在一个结构体之中是不能在定义一个与自身结构体类型相同的变量,但是可以定义一个与自身结构体类型相同的结构体类型指针。
例如:
typedef struct A1{
int i;
int *j;
struct A1 *L;
//struct A1 H; //结构体里是无法定义一个与它自身结构体同类型的变量的。
}A1_t;
为什么?
因为我们在定义好结构体的成员变量之后,系统会计算这个结构体占用的内存的大小。
但是 H 是一个 struct A1 类型的变量,所以只有在定义好之后才能计算这个结构体占用的内存的大小,
那么我们在定义H时,它的大小又是多少呢? 我们是不知道的。
所以无法在一个结构体中定义一个与结构体类型相同的变量。
因为无论什么类型的指针都占4个字节,所以我们是可以在结构体内,定义一个与结构体同类型的指针。
结构体的内存的对齐的问题
结构体对齐原则:在结构体内,有大于int类型(或有int类型)的数据时,按4字节进行对齐。
如果在结构体内,没有大于int类型的数据时,按最大的那个类型进行对齐
#include <stddef.h>
size_t offsetof(type , member);
功能:计算结构体中指定成员,相对于结构体开始地址偏移的字节个数;
参数:
@type:结构体
@member:结构体成员的地址
返回值:
成功:返回偏移的字节个数。
可以看到字符b占用了两个字节,那是为什么呢?这就是结构体对齐的问题;
点击查看代码
数据类型:
char 1个字节
short 2个字节
int 和 float 4个字节
double 8个字节
指针类型 4个字节
参考案例:08struct.c
#include <stdio.h>
struct aa{
char a;
char b;
char c;
};
struct bb{
char a; // 1
char b; // 1
char c; // 1
// 保留一个字节
short d; // 2
};
struct cc{
char a; // 1
char b; // 1
char c; // 1
// 保留一个字节
short d; // 2
// 保留2个字节
int e; // 4
};
struct dd{
char a; // 1
char b; // 1
char c; // 1
// 保留一个字节
short d; // 2
// 保留2个字节
int e; // 4
double f; // 8
};
标签:字节,定义,C语言,char,student,类型,结构 来源: https://www.cnblogs.com/lhj123/p/16416113.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。