c语言结构体讲解,C语言基础之结构体讲解

结构体

结构体是一种数据结构。 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语言结构体讲解)