结构体
我们在处理对象时或是一组数据时,如在处理人的年龄、家庭成员或是学生的成绩。需要创建大量的变量去描述相关事务,我们必须通过一个索引将数据项关联起来。
关键字struct能定义各种类型的变量集合,称为结构。
定义一个结构体Horse
,并创建一个用户Dobbin
,如下所示:
struct Horse{
int age;
int height;
char name[20];
char father[20];
char mather[20];
}Horse;
struct Horse dobbin = {24,17,"Dobbin","Trigger","Flossie"};
当然也可以用typedef
来重命名Horse
;
typedef struct Horse Horse;
Horse dobbin = {24,17,"Dobbin","Trigger","Flossie"};
我们来查看结构体在内存中占用的字节数,使用sizeof
运算符。
printf("sizeof(Horse) = %d\n",sizeof(Horse));
结果如下:
sizeof(Horse) = 68
因为int类型占4个字节的内存,char类型占一个字节,因此4+4+20*3 = 68;
结构体与数组
数组在内存中的表现是一片连续的存储空间,如下图所示:
类比两者,我们会发现
- 两个都有内部的成员,结构体表现的十分明显,而数组可以将数组每个元素当作一个成员,只不过它们没有成员名和内存大小固定;
- 在内存中的表现都是连续的存储空间;
当然结构体也可以作为一个数组来使用,使用方法与数组相似;
Horse my_horse[50];
这样就初始化了50个Horse结构体,在使用时也是通过索引值来调用;
my_horse[1] ={21,20,"XXXX","XXX","XXXX"};
结构体成员
结构体可以把所有基本数据类型(包括数组)作为成员变量,也可以将enum
、struct
、union
类型的数据作为成员变量,包括对应的指针;
#include <stdio.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
typedef enum {
num0,
num1,
num_max
}NUM;
typedef struct {
NUM a;
struct {
int a;
int b;
}date1;
union {
int a;
int b;
}date2;
int age;
int height;
char name[20];
char father[20];
char mather[20];
}Horse,*phorse;
Horse dobbin;
int main(void)
{
dobbin.date1.a = 1;
dobbin.date2.a = 1;
printf("sizeof(Horse) = %d\n",sizeof(Horse));
printf("hello world!!!\n");
return 0;
}
sizeof(Horse) = 84
因为date2是共用体在内存中只占用一个int的大小;
结构与函数
结构体与函数联用,有三种用法:结构作为函数变元、结构指针作为函数变元、作为函数返回值的结构;
与普通的变量用法一样。
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
typedef struct {
char *name;
int age;
char *father;
char *mather;
}Family,*pFamily;
Family copyFamily(pFamily pmember,Family member)
{
pmember->name = member.name;
pmember->age = member.age;
pmember->father = member.father;
pmember->mather = member.mather;
return member;
}
int printf_family(int a,Family member)
{
printf("Family%d:%s,%d,%s,%s\n",a,member.name,member.age,member.father,member.mather);
printf("\n");
return 0;
}
int main(void)
{
Family Family1 = {"bod",17,"Trigger","Flossie"};
Family Family2;
Family Family3;
Family3 = copyFamily(&Family2,Family1);
printf_family(1,Family1);
printf_family(2,Family2);
printf_family(3,Family3);
printf("hello world!!!\n");
return 0;
}
Family1:bod,17,Trigger,Flossie
Family2:bod,17,Trigger,Flossie
Family3:bod,17,Trigger,Flossie
hello world!!!