结构体与动态内存(5.11)

结构体与动态内存:

一、结构体

<1>结构体简介

特点:构造类型,可以构造出任何程序员想要的类型。

 

思考:如何定义一个结构体

struct  结构体名
{
		数据类型  成员变量名;
		数据类型  成员变量名;
		数据类型  成员变量名;
		...;
}

struct people 
{
		int id;
		char name[20];
		int score;
};


struct people pe;
struct people *p;
struct people p1[2];

------------------------------------------------------------

访问成员的规则:

(1)结构体普通变量通过"."来访问成员,例如:pe.id

(2)结构体指针变量通过"->"来访问成员,例如:p->id

------------------------------------------------------------

 

<2>结构体三种定义方式

1、先声明,在定义

struct  结构体名
{
		数据类型  成员变量名;
		数据类型  成员变量名;
		数据类型  成员变量名;
		...;
};

struct 结构体名  变量名;

2、在声明类型的同时,定义变量

struct 结构体名
{
		
		数据类型  成员变量名;
		数据类型  成员变量名;
		数据类型  成员变量名;
		...;
}变量名列表;

例如:

struct people
{
		char name[15];
		int age;
		int id;
}p1; //p1 是一个结构体变量

========>这里的p1,相当于struct people p1;

p1.age = 20;
p1.id = 15;

3、省略结构体名,直接定义结构体类型的变量

struct
{
		数据类型  成员变量名;
		...;
}变量名列表:

例如:

struct
{
	 char name[15];
	 int age;;
	 int id
}p1;

特点:只能定义一次,接下来不能再定义结构体变量了。


结构体类型和结构体变量

struct node
{
		int a;
}; =========》结构体类型


struct node Linklist; 结构体变量


练习:

大家把我定义的第二种和第三种分别用结构体指针和结构体变量来打印。

#include <stdio.h>
#include <string.h>

struct student
{
	int id;
	char name[20];
	char sex;
}*stu;

struct
{
	int id;
	char name[20];
	char sex;
}p,*q;

int main()
{
	struct student s;
	stu = &s;
	stu->id = 20;
	strcpy(stu->name,"jack");
	stu->sex = 'm';

	printf("id : %d\n",stu->id);
	printf("name : %s\n",stu->name);
	printf("sex : %c\n",stu->sex);

	printf("============================\n");

	q = &p;

	q->id = 20;
	strcpy(q->name,"rose");
	q->sex = 'w';

	printf("id : %d\n",q->id);
	printf("name : %s\n",q->name);
	printf("sex : %c\n",q->sex);
	
	return 0;
}


思考:为什么会出现字节对齐这种现象?

因为各个硬件对内存空间的处理不一样。一些特定的平台只能从特定的地址开始。

 

 

普通变量的大小

char  short int long float double  

1     2    4   4     4      8

位置偏移

char  short int long float double  

1     2    4   4     4      4

结构体成员的存放规则:

<1>结构体成员的相对偏移[成员偏移结构体首地址的字节数] % 本身的位置偏移 == 0,不满足则补齐,直到可以为0

<2>最后结构体的总大小 % 最大成员的位置偏移 == 0,不满足则补齐,直到可以为0

 

 

二、共用体(联合体)

思考:什么叫做共用体?

不同数据类型的数据可以使用共同的存放空间,这种数据类型我们叫做共用体。

 

特点:所用的成员共享同一块内存空间(最大成员变量)。

 

union 共用体名
{
		类型 成员1;
		类型 成员2;
		...
};

代码如下:

#include <stdio.h>

union stu
{
	char a;
	int b;
	short c;
};

struct s
{
	char a;
	int b;
	short c;
};

int main()
{
	struct s s1;
	union stu s2;

	printf("sizeof(struct) : %d\n",sizeof(s1));
	printf("sizeof(union) : %d\n",sizeof(s2));

	s1.a = 'c';
	s1.b = 10;
	s1.c = 45;

	printf("s1.a : %c\n",s1.a);
	printf("s1.b : %d\n",s1.b);
	printf("s1.c : %d\n",s1.c);

	printf("========================\n");

	s2.a = 'c';
	s2.b = 10;
	s2.c = 45;

	printf("s2.a : %c\n",s2.a
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值