自定义类型:结构体(较详细版)

1.结构体的声明

这是结构的开始我们要格外重视

struct tag//tag是这个结构体的名字
{
	member//这是成员变量的说
}variable;//首先这个分号一定不可以丢弃的说,其次这是这个结构体的类型

2.特殊的声明

struct 
{	
	int a;
	char b;
	float c;
}x;//这里我们可以看见这里缺少了结构体的名字的说;
//所以这个就叫匿名结构体类型
struct 
{
	int a;
	char b;
	float c;
	
}a[20],*p;

注意
若出现p=&x这个代码是不可以的,编译器回将上面的代码视为两个不同的类型的说,所以是非法的,如果没有对结构体类型重命名的话,这个结构体就会被覆盖;

3.结构的自引用

struct Node
{
	int data;
	struct Node net;
	
};

这里我们可以想象一下这个结构体会在内存中不断地开辟空间的说
在这里插入图片描述
你就会发现这时编译器就会报错呢;
在这里插入图片描述
但是当你加上*的时候就会不报错的说,
所以一个结构体内不可以包含一个同样大小的结构体变量
还有例如呢

typedef struct 
{
	int data;
	struct Node* next;
	
}Node;
//这种代码也是不行的,Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。
//所以加以修改的说 
typedef struct Node 
{
	int data;
	struct Node* next;
	
}Node;
//每次都不要使用匿名结构体的说

4.对于结构变量的创建和初始化

struct Point
{
	int x;
	int y;
	
}p1;//声明类型的同时定义变量p1;
struct Point p2;//定义结构体变量p2;

struct  Stu
{
	char name [15];
	int age;
	
};//声明
struct Stu s={"zhangsan",20};//初始化
//同样结构体也可以嵌套的说
struct Node 
{	
	int data;
	struct Point p;
	struct Node* next;
	
}n1={10,{4,5},NULL};
//在指示器初始化方式(C99),这种方式允许成员不按照顺序初始化

5.结构成员访问操作符

1.一般情况下访问操作符有两个一个是.,一个是->
主要是因为是否为指针类型的说

#define _CRT_SECURE_NO_WAENINGS 1
#include<stdio.h>
#include <string.h>
struct Stu
{
	char name[15];
	int age;

};
void print_stu(struct Stu s)
{
	printf("%s %d", s.name, s.age);
}
void set_stu(struct Stu* ps)
{
	strcpy(ps->name, "李四");
	ps->age = 28;
}
int main()
{
	struct Stu s = { "张三",20 };
	print_stu(s);
	set_stu(&s);
	print_stu(s);

	
	return 0;
}

6.结构体的内存对齐

这是一个非常热门的考点呢

#include <stddef.h>
#include <stdio.h>
struct S3
{
    double d;
    char c;
    int i;
};

struct S4
{
    char c1;
    struct S3 s3;
    double d;
};

int main()
{
    printf("%zd\n", sizeof(struct S3));//?
    printf("%zd\n", sizeof(struct S4));//?
	return 0;
}

这是结构体s3的内存在这里插入图片描述
在这里插入图片描述
这是结构体s4 在内存中的存储方式!

#include <stddef.h>
#include <stdio.h>
struct S3
{
    double d;
    char c;
    int i;
};

struct S4
{
    char c1;
    struct S3 s3;
    double d;
};

int main()
{
    //printf("%zd\n", sizeof(struct S3));//?
    //printf("%zd\n", sizeof(struct S4));//?
    //offsetof();//宏 - 用来计算结构体成员,相较于起始位置的偏移量的

    printf("%zd\n", offsetof(struct S4, c1));
    printf("%zd\n", offsetof(struct S4, s3));
    printf("%zd\n", offsetof(struct S4, d));
//这里的offsetof是函数用于计算偏移量的
    return 0;
}

到这里就结束喽,谢谢大家观看哦!😘😘😘😘

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值