当前位置:   article > 正文

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

struct关键字

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


一、struct—简介

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

二、struct—定义

1. 声明结构体类型

一般形式具体如下:

struct 结构名
{
	//成员列表
	类型 变量名;
	类型 变量名;
	....
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

举例说明如下:

//声明结构体类型
struct info
{
	char name[20];
	int  age;
	float height;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. 定义结构体变量

一般形式具体如下:

//声明结构体类型
struct info
{
	char name[20];
	int  age;
	float height;
};
//定义结构体变量
struct info person;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

合并简化形式具体如下:

struct info
{
	char name[20];
	int  age;
	float height;
}person;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

struct 
{
	char name[20];
	int  age;
	float height;
}person;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

一般形式具体如下:

typedef struct info
{
	char name[20];
	int  age;
	float height;
} NOM;
//定义结构体变量,以下两种效果一样
struct info person;
NOM person;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

typedef struct 
{
	char name[20];
	int  age;
	float height;
} NOM;
//定义结构体变量
NOM person;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、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
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

初始化后—赋值

strcpy(person.name,"MQ");
person.age	= 25;
person.height = 183.5;
  • 1
  • 2
  • 3

结构体参数—赋值

void struct_exd (NOM person)
{
	strcpy(person.name,"MQ");
	person.age=25;
	person.height = 183.5;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结构体返回值—赋值

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

	return person;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结构体数组—赋值

初始化定义时—赋值

NOM person[2]=
{
	{"MQ",25,183.5},
	{"VV",22,158.5}
};
  • 1
  • 2
  • 3
  • 4
  • 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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

一般形式—赋值

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

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

结构体指针参数—赋值

void struct_ex (NOM * person)
{
	strcpy(person->name,"MQ");
	person->age=25;
	person->height = 183.5;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果如下:

size=28
  • 1

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行结果如下:

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
  • 1
  • 2

计算结构体内存大小

变量偏移量必须是变量所占内存的整数倍,否则填充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()—字符串复制

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/143022
推荐阅读
相关标签
  

闽ICP备14008679号