c语言是面向过程的,没有类这个概念,因此结构体充当了类。
struct Test
{
char name[32];
int age;
};
- 结构体是一种构造数据类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际内存单元。
-
把不同类型的数据组合成一个整体——自定义数据类型
定义结构体
定义结构体变量的方法有很多种,一般使用下面两种。
struct Person
{
char name[32];
int age;
};
typedef struct tag_Person
{
char name[32];
int age;
}TPerson;
typedef
typedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型。
- 与#define不同,typedef仅限于数据类型,而不能是表达式或具体的值
- #define发生在预处理,typedef发生在编译阶段
初始化结构体变量
结构体变量:系统根据结构体类型(内部成员状况)为之分配空间。
一般习惯下面两种初始化方法,其他的不怎么常用。
struct Person
{
char name[32];
int age;
};
typedef struct tag_Person
{
char name[32];
int age;
}TPerson;
int main()
{
//定义同时初始化
struct Person p1 = {"ZHangsan",23};
TPerson p2 = {"Lisi",24};
printf("name = %s,age = %d\n",p1.name,p1.age);
printf("name = %s,age = %d\n",p2.name,p2.age);
//用指针法操作结构体
TPerson *p3 = &p2;
memset(p3,0,sizeof(TPerson));
strcpy(p3->name,"Lilei");
p3->age = 25;
printf("name = %s,age = %d\n",p3->name,p3->age);
//变量法操作结构体
memset(&p1,0,sizeof(struct Person));
strcpy(p1.name,"MeiMei");
p1.age = 26;
printf("name = %s,age = %d\n",p1.name,p1.age);
return 0;
}
堆区结构体变量
typedef struct tag_Person
{
char name[32];
int age;
}TPerson;
int main()
{
TPerson *p = NULL;
p = (TPerson *)malloc(sizeof(TPerson));
memset(p,0,sizeof(TPerson));
strcpy(p->name,"Lilei");
p->age = 21;
printf("p->name = %s, p->age=%d\n", p->name, p->age);
printf("(*p).name = %s, (*p).age=%d\n", (*p).name, (*p).age);
free(p);
p = NULL;
return 0;
}
结构体数组
typedef struct tag_Person
{
char name[32];
int age;
}TPerson;
int main()
{
TPerson p[3] =
{
{"Zhang",21},
{"Lilei",22},
{"MeiMei",23}
};
int i = 0;
int aveAge,sum = 0;
for ( i = 0; i < 3; i++)
{
sum += p[i].age;
}
aveAge = sum/3;
printf("sum = %d, aveAge = %d\n",sum,aveAge);
for ( i = 0; i < 3; i++)
{
printf("name = %s,age = %d\n",p[i].name,p[i].age);
}
return 0;
}
结构体做函数参数
struct Person
{
char name[32];
int age;
};
typedef struct tag_Person
{
char name[32];
int age;
}TPerson;
void PrintItem1(struct Person p);
void PrintItem2(TPerson *p);
int main()
{
//定义同时初始化
struct Person p1 = {"ZHangsan",23};
PrintItem1(p1);
TPerson p2 = {"Lisi",24};
PrintItem2(&p2);
return 0;
}
void PrintItem1(struct Person p)
{
printf("name = %s,age = %d\n",p.name,p.age);
}
void PrintItem2(TPerson *p)
{
printf("name = %s,age = %d\n",p->name,p->age);
}
结构体套一级指针
typedef struct tag_Person
{
char *name;
int age;
}TPerson;
int main()
{
TPerson *p = NULL;
p = (TPerson *)malloc(sizeof(TPerson));
p->name = (char *)malloc(sizeof(char)*10);
strcpy(p->name,"MeiMei");
p->age = 23;
printf("p->name = %s, p->age=%d\n", p->name, p->age);
printf("(*p).name = %s, (*p).age=%d\n", (*p).name, (*p).age);
if(p->name != NULL)free(p->name);p->name = NULL;
if(p != NULL)free(p);p = NULL;
return 0;
}
结构体的内存对齐原则
- 向最大内存占有者对齐
- 字节的分配是2的倍数位
- 单个内存大小为四个字节,32位系统(64位系统,单个内存为8个字节)。
结构体套结构体
注意:struct A的内存大小为8个字节,char本身占1个字节,但因为有int类型,所以必须分配4个字节,每个char占2个字节。