自定义类型:结构体

⽬录:

  1. 结构体类型的声明
  2. 结构体变量的创建和初始化
  3. 结构成员访问操作符
  4. 结构体内存对⻬
  5. 结构体传参
  6. 结构体实现位段

1. 结构体类型的声明

. 结构体类型的声明
前⾯我们在学习操作符的时候,已经学习了结构体的知识,这⾥稍微复习⼀下。
1.1 结构体回顾
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.1.1 结构的声明

cpp 复制代码
struct tag
{
member-list;
}variable-list;

例如描述⼀个学⽣:

cpp 复制代码
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
 char id[20];//学号
}; //分号不能丢

匿名结构体类型:

struct

{

char c;

int i;

double d;

}s;

int main()

{

return 0;

}

struct 匿名结构体类型把名字去掉,变量直接在}后创建:"s";

也可以初始化

cpp 复制代码
struct
{
    char c;
    int i;
    double d;
}s={'x',100,3.14};
int main()
{

    printf("%c %d %lf\n",s.c,s.i,s.d);
    return 0;
}

匿名结构体类型只能用一次;因为该结构没有名字

struct

{

char c;

int i;

double d;

}s;

struct

{

char c;

int i;

double d;

}*ps;

int main()

{

ps = &s;

return 0;

}

这样会报错,编译器会将上述两种声明当做完全不同的两个类型,所以是非法的

匿名结构体类型如果没对结构体进行重命名的话,基本只能使用一次

cpp 复制代码
typedef struct
{
	char c;
	int i;
	double d;
}S;




int main()
{
	S s;
	return 0;
}

意义不大

结构的自引用

数据结构:其实是数据在内存的存储和组织的结构

数据结构有多种,有的线性,树桩,图

线性:顺序表,链表,栈,队列

树形:二叉树

主要讲链表:

假设要在内存中存贮1 2 3 4 5

  1. 顺序表----数组

2.链表,每一份节点不仅携带数值还要有能力找到下一个数值

事实上还要有能力存放下一个节点相关的数据

那么对于链表节点的定义:

struct Node

{

int date;

struct Node n;

};

这样不合理。因为对于sizeof(struct Node)里边不仅包含date整形还包含一个跟他一样大的struct

后面无穷大

可以这样,存整形和下个节点的地址,最后一个存空指针

加上重命名

cpp 复制代码
typedef struct Node
{

int date;
struct Node* next;
}Node;

int main()
{
    Node s;
}

对于

能不能把struct搞到掉

typedef struct Node

{

int date;

Node* next;

}Node;

还不能的

因为还没完成重命名

同事匿名的结构体类型是不能完成结构体的自引用的

相关推荐
吃西瓜的年年8 小时前
1. 初识C语言
c语言·开发语言
永远都不秃头的程序员(互关)9 小时前
C语言 基本语法
c语言·开发语言
赖small强9 小时前
【Linux C/C++开发】Linux 平台 Stack Protector 机制深度解析
linux·c语言·c++·stack protector·stack-protector·金丝雀机制
liu****11 小时前
3.链表讲解
c语言·开发语言·数据结构·算法·链表
赖small强12 小时前
【Linux C/C++开发】Linux C/C++ 堆栈溢出:原理、利用与防护深度指南
linux·c语言·c++·stack·堆栈溢出
赖small强12 小时前
【Linux C/C++开发】Linux C/C++ 高效延迟崩溃分析:基于 mprotect 的内存陷阱技术 (Electric Fence)
linux·c语言·c++·mprotect·buffer overflow
繁华似锦respect12 小时前
C++ & Linux 中 GDB 调试与内存泄漏检测详解
linux·c语言·开发语言·c++·windows·算法
ULTRA??15 小时前
C语言简化版本开辟动态内存的万能MALLOC宏封装
c语言·开发语言
2401_8612775515 小时前
func(int* num)的实现是*num=2或者int a=3,num=&a都可以吗
c语言·c++
我要升天!15 小时前
QT -- 网络编程
c语言·开发语言·网络·c++·qt