概述
结构体
结构体是一种数据结构。 int 、float等是基本数据结构。 数组也是一种数据结构,但是数组存放的数据类型比较单一,结构体解决了数组里不能存放多种类型数据的这种缺陷。
1、结构体的声名
声名时,不占空间,只是声名了一种数据类型,定义时才分配空间
// struct声名结构体是必须有,infor是该种结构体的类型名,可自定义。
struct infor
{
char a[10];
float b;
int c;
};
2、结构体的变量定义
struct infor stu; //定义时也要有struct。
struct infor2
{
char a[5];
float b;
int c;
}a, b[3], *c; //可以在声明的同时定义变量。
//声名结构体时没有名字,声名之后无法调用,只能声名的同时定义变量,但编译时不会报错。
struct
{
int a;
float b;
char c;
}s;
//可以用typedef重命名类型以方便定义变量
//在声明时使用typdef,不写变量名也可使用
typedef struct
{
int a;
float b;
char c;
}S, *p_S;
//S是该类型结构体的新类型名,p_S是指向该类型变量的指针的类型名
S a;
p_S p;
3、结构体变量的初始化
struct infor
{
char a[50];
char b;
int c;
};
struct infor s1 = {"abc", 1};
//初始化时按成员顺序赋值,不完全初始化时补0.
//a[0] = 'a', a[1] = 'b', a[2] = 'c', 其余为0;
struct infor s2 = {.a="qew", .b=15}; //单独初始化
struct infor s3 = {.a=27, .a="qew"}; //单独初始化时,后者可以将前者覆盖。
struct infor *p_s = &s1;
4、结构体成员的赋值及调用
普通结构体变量取成员用 ‘.’ 运算符。 结构体指针取成员需要用 ‘->’ 运算符(类似于解引用)。
struct infor
{
char a[50];
char b;
int c;
};
struct infor s1 = {"abc", 1};
struct infor s2 = {.a=27, .a="qew"};
struct infor *p_s = &s1;
//初始化之后赋值就必须对成员单独一一赋值了。
s1.b = 18;
p_stu -> c = 16;
5、结构体的内存对齐原则
结构体的起始地址默认为4的整数倍,当结构体内 占内存最多的成员 所占字节数size小于4时,起始地址为size的整数倍
即结构体内占内存最大的成员是short时,
起始地址为2的整数倍(2<4,所以取2)。 结构体内占内存最大的成员是double时,
起始地址为4的整数倍(8>4,所以取默认值4)。 各成员的首地址均为自身所占内存的整数倍,所以就有了内存补齐原则
struct str1 // 7个字节有效数据
{
int a; // 4,int类型从地址是4的倍数处开始存储
char b; // 1
// 1 填充了1字节空间
short c; // 2,short类型从地址是2的倍数处开始存储
}s1; // 8
struct str2
{
char a; // 1
char b; // 1
// + 2 填充了2字节空间
int c; // 4
}s2; // 8
struct str3 // 6
{
int a;
char b;
char c;
// + 2 填充了2字节空间
}s3; // 8
struct str4 // 10
{
struct str1 s; // 8
char a; // 1 + 3 填充了3字节空间,因为struct str1中有int类型,所以要补齐4个字节。
}s4; // 12
struct str5 // 10
{
short a[4]; // 8
char b; // 1 + 1 填充了1字节空间
}s4; // 10
最后
以上就是大方枕头为你收集整理的c语言结构体讲解,C语言基础之结构体讲解的全部内容,希望文章能够帮你解决c语言结构体讲解,C语言基础之结构体讲解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复