系统学习之C复习(9)结构体

结构的声明

struct Student
{
    char name[20];
    int age;
    double achi;
};   //分号不可以丢掉

typedef 重定义 将struct Student 简写为 Student(自定义)
typedef struct Student
{
    char name[20];
    int  age;
    double achi;
}Student;

//自引用
struct Student_zi
{
    char name[20];
    struct Student_zi* next;
};

int main()
{
    struct Student s1;
    Student s2;

    return 0;
}*/

结构体的初始化

struct Book
{
	char name[20];
	float price;
	char id[12];
}s1 = { "C",100.0,"123"};

struct Node
{
	struct Book book1;
	struct Node* next;
};
int main()
{
	struct Book s2 = { "C++",100.0,"456" };//声明和初始化
	struct Node n1 = { {"C",50.0,"ASD"},NULL };//嵌套形结构体
	return 0;
}

结构体的内存对齐!!! 重要部分

1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    VS中默认的值为8
    Liunx下没有默认对齐数,自身的大小就是对齐数
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

struct S3
{
	double d;		8	8
	char c;			1	4		
	int i;			4	4		
};
printf("%d\n", sizeof(struct S3));	16

struct S4
{
char c1;		//1  →  4		4
struct S3 s3;	//8  → 24		16	
double d;		//24 → 32		8
};
printf("%d\n", sizeof(struct S4));	32

为什么存在内存对齐?
1.平台原因(移植原因)
2.性能原因:为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
结构体的内存对齐是拿空间来换取时间的做法

修改默认对齐数

#pragma 这个预处理指令,此处也可以进行修改默认对齐数

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
    char c1;
    int i;
    char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

结构体传参 

结构体传参的时候,要传结构体的地址。

struct S
{
	int data[1000];
	int num;
};
struct S s = { {1,2,3,4}, 1000 };
//结构体传参
void print1(struct S s)
{
	printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);
}
int main()
{
	print1(s); //传结构体
	print2(&s); //传地址
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值