一、结构体的概念
在C语言中,使用结构体(struct)来存放一组不同类型的数据。当需要定义大量不同类型的变量时,对这些变量一一初始化太过麻烦,此时可以采用结构体。
结构体格式如下:
struct 结构体名称
{
结构体成员1的声明;
结构体成员2的声明;
结构体成员3的声明;
...
结构体成员n的声明;
};
结构体是不同类型数据构成的一个集合,是程序员自定义的一种数据类型。结构体成员可以是任何类型的变量。
struct student
{
char name[21]; /*姓名*/
int age; /*年龄*/
int height; /*身高*/
};
二、结构体变量
结构体也是一种数据类型,是程序员自定义的,也可以用来定义变量。
例如
struct student tang,zhou
就定义了tang和zhou两个结构体变量。
三、结构体占用内存情况
为了对齐内存空间,结构体各个成员之间可能存在缝隙,使用sizeof求结构体占用的空间大小时会把缝隙一同计算进去。
#include<stdio.h>
struct student
{
char name[50];
int age;
int height;
char mother[30];
char father[30];
};
int main()
{
struct student tang;
printf("%d\n",sizeof(struct student)); /*输出结果为120*/
printf("%d\n",sizeof(tang)); /*输出结果为120*/
}
两个整型所占空间为8,50+8+30+30=118,结果却是120,这是因为结构体成员间存在间隙。消除间隙只需要加一个#pragma pack(1)
#include<stdio.h>
#pragma pack(1)
struct student
{
char name[50];
int age;
int height;
char mother[30];
char father[30];
};
int main()
{
struct student tang;
printf("%d\n",sizeof(struct student)); /*输出结果为118*/
printf("%d\n",sizeof(tang)); /*输出结果为118*/
}
四、结构体的初始化
采用memset来初始化结构体,下面两种写法都行。
memset(&tang,0,sizeof(tang));
memset(&tang,0,sizeof(struct student));
五、结构体数组
结构体可以被定义为数组变量,本质上与其他类型的数组变量没有区别
struct student ifm[5];
memset(ifm,0,sizeof(ifm));
strcpy(ifm[0].name,"小明");
ifm[0].age = 12;
strcpy(ifm[1].name,"小红");
ifm[1].age = 11;
...
六、结构体指针
结构体变量是内存变量,有内存就有地址,也就有结构体指针。
struct student tang;
struct student *p = &tang;
可以通过结构体指针来定义结构体成员,比如
(*p).name;
在这个表达式中 . 的优先级高于 * ,所以得加一个括号,如果去掉()就等效于*(p.name)。
还可以用
p->name;
来表示,->是一种新的运算符,可以通过它使结构体指针直接使用结构体成员。为了更直观一般选用这种写法。
七、结构体的复制
基本数据类型(int、double、char)可以用 = 直接赋值。如果不是基本数据类型而是字符串,赋值可以采用strcpy函数。如果要把结构体变量的值赋给另一个结构体变量有两种方法:
1、结构体成员逐一赋值
2、采用memcpy函数进行内存拷贝,strcpy只能拷贝字符串,memcpy可以拷贝所有的类型。
void *memcpy(void *dest,const void *src,size_t n)
参数说明:
src:源内存变量的起始地址
dest:目的内存变量的起始地址
n:需要复制内容的字节数
函数返回指向dest
栗子:
#include<stdio.h>
#include<string.h>
struct student
{
char name[50];
int age;
int height;
char mother[30];
char father[30];
};
int main()
{
struct student tang,zhou;
strcpy(&zhou,"mengchen");
memcpy(&tang,&zhou,sizeof(struct student));
printf("%s\n",zhou.name); /*输出结果为mengchen*/
printf("%s\n",tang.name); /*输出结果为mengchen*/
}