C语言基础 入门学习(九)

结构体相关知识

一、定义一个结构体

struct Student1
{
	char name[10];
	int age;
	char sex[2];
}stu={ "zf",18,'n' };

stu代表的是结构体Student1的一个变量 初始化为 “zf”,18,‘n’
注意:
1.定义一个结构体并且有变量时,一定要给变量直接初始化
2.结构体里面不能进行赋值

二、typedef关键字

typedef struct Student2
{
	char name[10];
	int age;
	char sex[2];
}st;

typedef 自定义类型
typedef int(*P)[3];//P由变量提升为类型

typedef struct A
{
	char a;
	int b;
}Aa;//

Aa为struct A类型
三、如何访问结构体成员

typedef struct Student
{
	char name[10];
	int age;
}studnt;


void show(studnt stu)
{
	printf("%s,%d", stu.name, stu.age);
}
void show2(studnt *pstu)//
{
	printf("%s,%d", pstu->name, pstu->age);//->与[] 自带解引用
	printf("%s,%d", (*pstu).name, (*pstu).age);
}

1.定义一个该结构体变量类型的变量 在此处即是定义一个studnt类型的变量stu 利用 变量名.成员
2.定义一个该结构体变量类型的指针 在此处即是定义一个studnt类型的指针*pstu 利用 指针->成员
->与[] 自带解引用

四、结构之间的访问

typedef struct A
{
	char a;
	int b;
}Aa;//Aa为struct A类型
struct B//结构体里面不能进行赋值 
{
	int i;
	struct A Aaa;
	struct A *p;
}Bb;
int main()
{
	Aa a = { 'a',10 };
	printf("%c  %d\n", a.a, a.b);//访问结构体成员 用   变量名.成员
	Bb.i;//用Bb访问自身成员i
		 //  .取决于是否为变量    ->是否为指针

	Bb.Aaa.a;//用Bb访问A的成员
	Bb.p->a;//用Bb访问A的成员
	Bb.p->b;
	return 0;
}

五、结构体数组

typedef struct Student
{
	char name[10];
	int age;
}studnt;

void Show(studnt *p, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%s,%d   \n", p[i].name, p[i].age);
	}
}
int main()
{
	studnt arr[3] = { { "caocao",10 },{ "lieu",50),{ "fdsfsd",45 });
	int len = sizeof(arr) / sizeof(arr[0]);
	Show(arr,len);
	return 0;
}

六、结构体字节的计算

		struct A
		{
			char a;//1
			int b;//4
		};//8
		struct B
		{
			char a;//1 +1 
			short c;//2  要对齐 则前面的+1  为2
			int b;//4
		};//8
		struct B//向前对其
		{
			char a;//1 +3 	
			int b;//4
			short c;//2 +6
			double d;//8
		};//24
		struct B//向后对齐
		{
			int a;//4
			char c;//1

		};//24
struct A
{
	int a;//4
	int b;//4
};//4+4

结构体A占用内存为8字节

struct B
{
	char a;//1+3
	int b;//4
};1+3+4

结构体B占用内存为8,char类型占用字节数为1,但要保证前一个字节数是后一个字节数倍数,所以需要在char类型后+3

+3的原因:

在这里插入图片描述

虽然在a后面浪费了3个内存,但是104可以整除4,108可以整除2,这样子会使得计算机的运行速度加快,浪费的内存数对于计算机而言是很少很少的一部分。

struct F
{
	char a;//1+3
	int b;//4
	short c;//2
};//10+2  //内存要满足是最大字节数的倍数  //10不是4的倍数,所以应该+2

结构体F的内存是12 //10+2

+2的原因

在这里插入图片描述

在没有+2之前,114不可以整除4

在+2之后,浪费的2个字节数在c之后,在这个时候的116可以整除4,同样是浪费2个字节数,用来换取运行速度的提高。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct A
{
	int a;//4
	int b;//4
};//4+4
 
struct B
{
	char a;//1+3
	int b;//4
};
 
struct C
{
	char a;//1+1
	short b;//2
	int c;//4
};//8
 
struct D
{
	char a;//1+3
	int b;//4
	int c;//4+4
	double d;//8
};
 
struct E
{
	short a;//2+2
	int b;//4
	long long *c;//4
};
 
struct F
{
	char a;//1+3
	int b;//4
	short c;//2
};//10+2  //内存要满足是最大字节数的倍数  //10不是4的倍数,所以应该+2
 
struct G//不需要考虑对齐的应用
{
	char a;
	char x;//保留,不使用
	short b;
	int c;
};
 
struct H
{
	int a;
	struct HH//12
	{
		char b;//12,13~15
		int c;//16
	}d;
};//12
 
struct I
{
	int a;//8
	double b;//12
};//16
 
int main()
{
	printf("%d\n",sizeof(struct A));
	printf("%d\n",sizeof(struct B));
	printf("%d\n",sizeof(struct C));
	printf("%d\n",sizeof(struct D));
	printf("%d\n",sizeof(struct E));
	printf("%d\n",sizeof(struct F));
	printf("%d\n",sizeof(struct G));
	printf("%d\n",sizeof(struct H));
	printf("%d\n",sizeof(struct I));
 
	return 0;
}

!注意:指针只占用4个字节数

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值