当前位置: 首页 > 工具软件 > CStruct > 使用案例 >

C语言:关键字---struct(声明结构体类型)

汲丰茂
2023-12-01

C语言32个关键字
有32个关键字详细说明,还有跳转链接!


一、struct—简介

struct就是结构体,用来描述需要相同类型或不同类型数据的数据对象。
通俗的说法就是打包封装,将一些分散的数据整合在一起。
结构体的优点: 结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。

二、struct—定义

1. 声明结构体类型

一般形式具体如下:

struct 结构名
{
	//成员列表
	类型 变量名;
	类型 变量名;
	....
};

举例说明如下:

//声明结构体类型
struct info
{
	char name[20];
	int  age;
	float height;
};

2. 定义结构体变量

一般形式具体如下:

//声明结构体类型
struct info
{
	char name[20];
	int  age;
	float height;
};
//定义结构体变量
struct info person;

合并简化形式具体如下:

struct info
{
	char name[20];
	int  age;
	float height;
}person;

匿名结构体形式具体如下:

struct 
{
	char name[20];
	int  age;
	float height;
}person;

3. 使用typedef声明结构体类型,再定义结构体变量

一般形式具体如下:

typedef struct info
{
	char name[20];
	int  age;
	float height;
} NOM;
//定义结构体变量,以下两种效果一样
struct info person;
NOM person;

匿名结构体形式具体如下:

typedef struct 
{
	char name[20];
	int  age;
	float height;
} NOM;
//定义结构体变量
NOM person;

三、struct—使用方法

1. 结构体变量成员—赋值(.)

一般形式—赋值

初始化定义时—赋值

//声明结构体类型
typedef struct 
{
	char name[20];
	int  age;
	float height;
} NOM;

//定义结构体变量---初始化赋值1
NOM person={"MQ",25,183.5};
//定义结构体变量---初始化赋值2
NOM person=
{
	.name = "MQ",
	.age  = 25,
	.height = 183.5
};

初始化后—赋值

strcpy(person.name,"MQ");
person.age	= 25;
person.height = 183.5;

结构体参数—赋值

void struct_exd (NOM person)
{
	strcpy(person.name,"MQ");
	person.age=25;
	person.height = 183.5;
}

结构体返回值—赋值

NOM struct_exd (void)
{
	NOM person;
	strcpy(person.name,"MQ");
	person.age=25;
	person.height = 183.5;

	return person;
}

结构体数组—赋值

初始化定义时—赋值

NOM person[2]=
{
	{"MQ",25,183.5},
	{"VV",22,158.5}
};

初始化后—赋值

strcpy(person[0].name,"MQ");
person[0].age	= 25;
person[0].height = 183.5;
strcpy(person[1].name,"VV");
person[1].age	= 22;
person[1].height = 158.5;

2. 结构体指针变量成员—赋值(->)

一般形式—赋值

结构体指针变量就是指向结构体首地址的指针,并没有给变量分配内存。
所以在给结构体指针变量成员赋值前,要先分配内存。

NOM *per;
per = (NOM*)malloc(sizeof(NOM));//分配内存
strcpy(per->name,"MQ");
per->age = 25;
per->height = 183.5;

结构体指针参数—赋值

void struct_ex (NOM * person)
{
	strcpy(person->name,"MQ");
	person->age=25;
	person->height = 183.5;
} 

3. 位结构体

位结构体是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构体比按位运算符更加方便。
具体详细说明,请点击下面蓝色字体链接!

C语言:位结构体

四、struct—占用内存空间

声明结构体类型的时候没有申请内存空间,定义结构体变量的时候,就分配内存空间。
由于分配内存时有默认的对齐方式,所以结构体的内存大小并不都是结构体所含变量内存的总和。
一般情况,具体信息如下:

#include <stdio.h>

typedef struct 
{
	char name[20];
	int  age;
	float height;
} NOM;

int main(int argc, char *argv[])
{
	printf("size=%d\n",sizeof(NOM));
	return 0;
}

运行结果如下:

size=28

20(name[20])+4(age)+4(height)=28

特殊情况,具体信息如下:

#include <stdio.h>

struct MQ
{
	char    a;
	int 	b;	
	char	c;
	short 	d;
	short 	e;
	char	f;
	short 	g;
	int  	h;
	char    k;
} data={'a',0x55555555,'b',0x1111,0x2222,'c',0x3333,0x44444444,'d'};
//这样定义有利于判断填充字节 

int main(void)
{
	int i=0,adder=0;
	printf("struct=%d\n",sizeof(data));

	adder=&data;
	for(i=0;i<sizeof(data);i++)
	printf("%x ",*(unsigned __int8*)(adder+i));
	printf("\n");

	return 0;
}

运行结果如下:

struct=28
61 0 0 0 55 55 55 55 62 0 11 11 22 22 63 0 33 33 0 0 44 44 44 44 64 0 0 0

计算结构体内存大小

变量偏移量必须是变量所占内存的整数倍,否则填充0对齐。
结构体的总内存必须是最长变量内存的整数倍,否则填充0对齐。

变量偏移量内存数据(hex)
char a0461 0 0 0
int b4455 55 55 55
char c8262 0
short d10211 11
short e12222 22
char f14263 0
short g16433 33 0 0
int h20444 44 44 44
char k24464 0 0 0

内存总和28=最后变量的偏移量24+最后变量占的内存4


C语言:位结构体

C语言:strcpy()—字符串复制

 类似资料: