C语言杂记——结构体

结构体

我们在处理对象时或是一组数据时,如在处理人的年龄、家庭成员或是学生的成绩。需要创建大量的变量去描述相关事务,我们必须通过一个索引将数据项关联起来。
关键字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"};

结构体成员

结构体可以把所有基本数据类型(包括数组)作为成员变量,也可以将enumstructunion类型的数据作为成员变量,包括对应的指针;

#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!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值