完全自学C(干货) —— 自定义类型

机械转行java自学经历,零基础学java,血泪总结的干货 机械转行java自学经历,零基础学java,血泪总结的干货 据说,再恩爱的夫妻,一生中都有100次想离婚的念头和50次想掐死对方的冲动。 求职路上亦是如此,打开这篇文章,相信你也有转行的想法。和身边的朋友聊过,入职后的他们,或多或少对现在的职位都有些不满,都有过转行的冲动。 可他们只是想,而我真的这样做了。 下面就介绍下我转行的血泪史。 我为什么要转行 高中复读了一年,考了个双非院校的机械。当时... 阅读详情

目录

一,结构体struct

结构体声明

结构体变量的定义和初始化

结构体内存对齐

结构体传参

位段

二,枚举enum

枚举类型的定义

枚举的使用

枚举的优点

三,联合union

联合类型的定义

联合的特点

联合大小的计算

四,案例


  • 结构体是一些值的集合,称为成员变量;
  • 每个成员可以是不同类型;

一,结构体struct

结构体声明

1,一般声明

  • 结构体关键字,结构体标签,结构体成员;
//结构体声明
struct Stu
{
    //结构体成员
	char name[20];
	int age;
	char sex[5];
	double id[20];
}; //封号不可丢

2,特殊声明(不完全声明)

  • 以上均为完全声明,不完全声明即声明时省略标签;
  • 此为匿名声明,但只有声明时才能定义变量;
//结构体声明
struct 
{
    //结构体成员
	char name[20];
	int age;
	char sex[5];
	double id[20];
} stu; //只有声明时才能定义变量
struct 
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
} stu; 

struct 
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
} *p;

int main()
{
	//警告: 编译器会把上面的两个声明当成完全不同的两个类型, 所以是非法的;
	p = &stu; 
}

3,结构体自引用

  • 结构体可以包含同类型结构体指针;
  • 如链表;
struct Stu
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
    struct Stu stu; //报错,不可包含结构体本身成员
};
//正确写法,可开辟确定的空间
struct Stu
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
    struct Stu* p; 
};
//匿名声明,并重定义为Stu
typedef struct
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
	Stu* stu; //报错,因为需先有结构体类型,才能重定义
}Stu;
//正确写法
typedef struct Stu
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
	struct Stu* stu; //struct不可省略
}Stu;

结构体变量的定义和初始化

1,结构体变量定义

  • 声明时定义变量;
  • 声明后定义变量(不可为匿名声明);
struct Stu
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
}s1, s2; //声明时定义变量

int main()
{
	struct Stu s3, s4; //声明后定义变量(不可为匿名声明)
	return 0;
}
//通过重定义类型来简化定义
typedef struct Stu
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
}Stu; 

int main()
{
	Stu stu; 
	return 0;
}

2,结构体初始化

  • 定义的同时赋初值;
  • 可嵌套初始化;
struct Stu
{
	char name[20];
	int age;
	char sex[5];
	double id[20];
}s1 = { "zhangsan",20,"male",3.14 }; //初始化

struct Book
{
	char bname[20];
	struct Stu s2;
};

int main()
{
	struct Stu stu = { "lisi",21,"male",4.28 }; //初始化
	struct Book book = { "C",{ "wangwu",22,"male",7.68 } }; //嵌套初始化
	return 0;
}
struct S
{
	char name[20];
	int age;
}s1;

int main()
{
	//两结构体可直接传值
	struct S s1 = { "zhangsan",10 };
	struct S s2 = { "lisi",20 };
	s1 = s2; 
	printf("%s %d", s1.name, s1.age);
	return 0;
}
//结果:lisi 20

//注意:
//数组不可通过数组名,直接传值(数组名表示首元素地址了);
//枚举可以通过变量名,直接传值;
//联合体可以通过变量名,直接传值;

结构体内存对齐

  • 结构体类型的尺寸大小,需遵循内存对齐规则;

1,对齐规则

  • 结构体第一个成员变量,在结构体中内存偏移量为0;
  • 其他成员变量,需对齐到该变量对齐数整数倍的地址处;
    • 即偏移量为该成员变量对齐数的整数倍;
    • 若为嵌套结构体,则对齐到该结构体内最大对齐数的整数倍处;
  • 结构体总大小,为所有成员变量中最大对齐数的整数倍(含嵌套结构体中的对齐数);

注:

  • 成员变量对齐数=min(编译器默认的对齐数,该成员大小);
  • VS默认为8,Linux无默认对齐数概念;
//默认编译器对齐数为8
struct S1
{
	char a; //min(1,8)=1
	int b; //min(4,8)=4
};

struct S2
{
	int b; //min(4,8)=4
	char a; //min(1,8)=1
};

struct S3
{
	char a; //min(1,8)=1
	int b; //min(4,8)=4
	char c; //min(1,8)=1
};

struct S4
{
	char a; //min(1,8)=1
	int b; //min(4,8)=4
	struct S3 s; //min(4,8)=4
};

int main()
{
	printf("%d ", sizeof(struct S1)); // 8
	printf("%d ", sizeof(struct S2)); // 8
	printf("%d ", sizeof(struct S3)); // 12
	printf("%d ", sizeof(struct S4)); // 20(嵌套)
    return 0;
}

 

 

 

2,存在内存对齐的原因

  • 平台原因(移植原因),不是所有的硬件平台都能访问任意地址上的任意数据;某些平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常;
  • 性能原因,数据结构(尤其是栈)应该尽可能地在自然边界上对齐;原因在于,为了访问未对齐内存,处理器需要作两次内存访问,而对齐内存访问仅需要一次访问;
  • 结构体内存对齐是拿空间换取时间的做法;

设计结构体时,既要满足对齐又要节省空间,可让占空间小的成员尽量集中在一起;

//默认编译器对齐数为8
struct S1
{
	char a; //min(1,8)=1
	int b; //min(4,8)=4
	char c; //min(1,8)=1
};

struct S2
{
	char a; //min(1,8)=1
	char c; //min(1,8)=1
	int b; //min(4,8)=4
};

int main()
{
	printf("%d ", sizeof(struct S1)); // 12
	printf("%d ", sizeof(struct S2)); // 8
    return 0;
}

3,修改默认对齐数

结构体在对齐方式不合适的时候, 可以自己更改默认对齐数;

  • #pragma pack(8) 设置默认对齐数;
  •  #pragma pack() 取消设置默认对齐数;
//默认编译器对齐数为8
#pragma pack (2)
struct S1
{
	char a; //min(1,8)=1
	int b; //min(4,8)=4
	char c; //min(1,8)=1
};
#pragma pack()

int main()
{
	printf("%d ", sizeof(struct S1)); // 8(对齐数为8时值为12)
    return 0;
}

4,offsetof 宏

offsetof ( struct s,name )

  • 返回成员变量相对起始位置的偏移量;
  • 注,不对位段使用;
//(类型说明符) (表达式) ,是把变量、数值、表达式的运算结果强制转换成类型说明符所表示的类型;
//模拟实现offsetof宏
#define offsetof(type, member) (int)&((type*)0)->member)
//默认编译器对齐数为8
#include <stddef.h>
struct S1
{
	char a; //min(1,8)=1
	int b; //min(4,8)=4
	char c; //min(1,8)=1
};

int main()
{
	printf("%d ", sizeof(struct S1)); // 12
	printf("%d ", offsetof(struct S1, a)); //偏移量0
	printf("%d ", offsetof(struct S1, b)); //偏移量4
	printf("%d ", offsetof(struct S1, c)); //偏移量8
    return 0;
}

结构体传参

  • 直接传结构体的值,即传值;
  • 传结构体的地址,即传址(函数传参时,建议传址);

函数传参时,参数需压栈;如结构体过大,传值会参数压栈系统开销过大,导致性能下降;

详情请见《函数栈帧的创建和销毁》;

struct Book
{
	char name[20];
	float price;
	int num;
};
 
void print1(struct Book book) //传参-传值
{
	printf("%s\n", book.name);
}
 
void print2(const struct Book* pbook) //传参-传址
{
	printf("%s\n", pbook->name);
}
 
int main()
{
	struct Book book = { "C语言", 99.5, 10 };
	struct Book* pbook = &book;
	print1(book); //结果:C语言
	print2(pbook); //结果:C语言
	return 0;
}

附:参数压栈

  • 栈,是一种数据结构,遵循“先进后出,后进先出”;
  • 函数调用,会在内存的栈区开辟一块空间(内存可分为栈区、堆区、静态区);
int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
 
int main()
{
	int a = 2;
	int b = 4;
	int sum = 0;
	sum = Add(a, b);
	return 0;
}

位段

1,位段的声明

和结构体是类似的,但有两个不同:

  • 位段的成员必须是 int,unsigned int,signed int,或char;
  • 位段的成员名后边有一个冒号和一个数字(占比特位数);
struct S
{
	//冒号后的数字,表示该成员所占比特位数
	int a:3; 
	int b:4; 
	int c:30; 
};

2,位段的内存分配

  • 成员是int,unsigned int/signed int,或char类型;
  • 空间上是按照以4个字节int或一个字节char的方式开辟的;
  • 涉及好多不确定因素,位段是不跨平台的,注重可移植性的程序应该避免使用位段;
struct S
{
	//冒号后的数字,表示该成员所占比特位数
	int a:3; 
	int b:4; 
	int c:30; 
};

int main()
{
	struct S s = { 30,40,50 };
	printf("%d ", sizeof(struct S)); //8
	return 0;
}
  • 在VS内,从右向左存储(如是int);
  • 剩余不够的空间,浪费掉;

 

3,位段的跨平台问题

  • int位段被当成有符号还是无符号数不确定;
  • 位段中最大位的数目不确定(int在16位机器最大16,32位机器最大32);
  • 位段中的成员在内存中从左向右,还是从右向左分配标准尚未定义;
  • 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一位段剩余的位时,时舍弃剩余位段还是利用,不确定;

跟结构相比,位段可达到同样的效果,可以很好的节省空间,但是有跨平台的问题存在;


二,枚举enum

  • 即可以一 一 列举可能的值;
  • 值,即枚举常量,默认从0开始;
  • 也可设置初值,那么其后的值依次递增;
//枚举类型
enum sex
{
    //可能取的值
	male, // 0
	female, // 1
	sceret // 2
};

enum color
{
	red = 2, // 2
	green, // 3
	blue // 4
};

enum days
{
	mon, // 0
	tues, // 1
	wed, // 2
	thur, // 3
	fri, // 4
	sat, // 5
	sun // 6
};

枚举类型的定义

//声明枚举类型
enum color
{
	red,
	green,
	blue
};

int main()
{
	enum color c = green;
	printf("%d ", c); // 1
	c = red;
	printf("%d ", c); // 0
    return 0;
}

枚举的使用

//枚举类型
enum color
{
	red = 1,
	green = 2,
	blue = 4
};

int main()
{
	//只能拿枚举常量给枚举变量赋值,才不会出现类型差异
	enum color c = green; //c = 2,这样书写c++会报错;
	printf("%d ", c); 
	return 0;
}

枚举的优点

  • 增加代码的可读性和可维护性;
  • 和#define定义的标识符比较,枚举有类型检查,更加严谨;
  • 防止了命名污染(命名冲突);
  • 使用方便,一次可以定义多个常量(define一次只可定义一个);
  • 便于调试(define在预编译时已替换);

三,联合union

  • 是一种特殊的自定义类型,也称共用体;
  • 此类型定义的变量包含一系列的成员,但这些成员公用同一块空间;

联合类型的定义

//联合类型
union U
{
	char c;
	int i;
	long long l;
};

联合的特点

  • 联合成员公用同一块空间;
  • 联合成员变量的大小,至少是最大成员的大小;
//联合类型
union U
{
	char c;
	int i;
	long long l;
};

int main()
{
	union U un;
	//大小至少是最大成员的大小
	printf("%d ", sizeof(union U)); //8
	//成员变量的地址相同
	printf("%p ", &(un.c)); //00EFF7CC
	printf("%p ", &(un.i)); //00EFF7CC
	printf("%p ", &(un.l)); //00EFF7CC
    return 0;
}

联合大小的计算

  • 联合大小至少是最大成员的大小;
  • 当最大成员大小不是最大对齐数的整数倍时,就要对齐最大对其数的整数倍;
//联合类型
union U
{
	char c; //大小1,对齐数1(1/8)
	int i; //大小4,对齐数4(4/8)
	long long l; //大小8,对齐数8(8/8)
	int arr[3]; //大小12,对齐数8(12/8)
};

int main()
{
	union U un;
	//大小至少是最大成员的大小(>=12)
	//且要是最大对齐数的整数倍(即8的倍数)
	printf("%d ", sizeof(union U)); //16
}
//计算大小端
//方法一
int check_sys()
{
	int a = 1;
	return *((char*)&a);
}

//方法二
int check_sys()
{
	union U
	{
		char a;
		int b;
	}un;
	un.b = 1;
	return un.a;
}

四,案例

没基础的大学生如何自学c语言 ? 史上最强C语言学习大全,多亏我足够无耻,才从公司六位C语言程序员口中问出方法来。 没错。 这篇文章总结于我们公司六位使用C语言作为开发语言的程序员前辈,方方面面近三千五百字。 C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。真的太多人学也有太多要学的东西了,以至于后台总有人问C语言该怎么学,甚至还有具体问编程问题的。 乘此机会,整理C语言程序员的从入门到精通之路,分享一下这么多年来我们公司C语言程序员的学习心得。 为了这篇文章,我是费尽口舌,软磨硬泡收集到信息之后,又花 阅读详情

相关推荐

深入理解C语言内存管理:堆与栈的区别

栈是一种遵循后进先出(LIFO)原则的数据结构。在程序中,栈用于存储局部变量、函数的参数以及函数调用时的返回地址等信息。栈的内存管理由操作系统自动进行,每次函数调用时都会在栈上分配一块内存区域,函数执行完毕后,该内存区域会自动释放。在C语言中,堆与栈是两种不同的内存分配方式,各自有着不同的特点和适用场景。栈内存自动管理,访问速度快,但大小有限,适用于存储局部变量和函数调用信息。堆内存由程序员手动管理,适用于存储动态数据结构,大小不受限制,但访问速度较慢,容易导致内存泄漏等问题。

set_one的博客 1579

完全自学C(干货) —— C简介

C介绍

NapoleonCoder的博客 2343

gd32 spi 发送&中断接收例程

【代码】gd32 spi 发送&中断接收例程。

weixin_43026921的博客 1651

手把手教你如何自学计算机,绝对的干货满满!!!

a. 自我介绍; 在下姓赵,编程萌新,现大一,非计算机专业新生,第一次接触并学习C语言是大一上学期,学习一段时间后尝试写 b. 编程目标; c. 如何学习编程; d. 在学习编程上每周花费多少时间; e. 我最想进入的一家IT公司; ...

qq_56847032的博客 3万+

AI Agent Harness Engineering 监控与日志系统搭建

在生成式AI(Generative AI)与大语言模型(LLM)普及的今天,AI Agent(自主智能代理)已经成为了继「LLM API调用」「单轮/多轮对话」之后的第三代AI应用范式——Agent能够自主感知环境、制定多步决策、调用外部工具(Web搜索、数据库、RAG检索、企业系统API等)、执行复杂任务并优化自身策略。然而,随着Agent应用从Demo原型快速落地到企业生产环境,一系列与工程化落地强绑定的可观测性(Observability)问题正在成为Agent项目成功上线、稳定运行的最大瓶颈。

AI开发架构师 184

Flink CDC 3.0 详解

Flink CDC 是基于数据库日志 CDC(Change Data Capture)技术的实时数据集成框架,支持全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量数据的实时集成。Flink CDC 于2023年12月7日重磅推出其全新的 3.0 版本,3.0版本的发布对 Flink CDC 而言具有里程碑的意义,自此 Flink CDC 从捕获数据变更的Flink 数据源正式迈向为以 Flink

奔跑的蜗牛的博客 2638

30个珍藏的程序员超实用自学网站,干货!

有朋友问我平时都是在哪里自学的呢?大学四年以来我收藏了各种学习网站今天一次性分享给大家,一起学习! 一、视频类自学网站 1.哔哩哔哩 自学观看各种教程视频,比较推荐B站,各个领域极其全面。 网址:https://www.bilibili.com/ 2.慕课网 这个网站也是比较常用的,有各种实用的教程,如果你想快速入门一种语言的话,可以到这看看。 网址:https://www.imooc.com...

zag666的博客 3万+

土壤水动力学_前 言

Van Genuchten (V-G) 模型是土壤水分特征曲线中最常用的模型之一。它通过数学方程描述了土壤基质吸力与体积含水量之间的关系,被广泛应用于土壤水分运移、土壤盐渍化、边坡稳定性等研究领域。V-G模型是描述土壤水分特征曲线的重要工具,但它并不是完美的。在实际应用中,需要根据土壤类型、试验条件等因素选择合适的模型。土壤基质吸力是土壤水分学中的一个重要概念,它对土壤水分的保持、植物的生长以及土壤的工程性质都有重要影响。

weixin_44259522的博客 5325

完全自学C(干货) —— 编译与链接

编译与链接,预处理指令;

NapoleonCoder的博客 1203

在虚拟机中对阿克曼转向车进行导航及避障的仿真测试

一、    在我使用rosdep install teb_local_planner去安装teb_local_planner的时候,报错:Command ‘rosdep’ not found, but can be installed with:sudo apt install python3-rosdep2    我花大半个月好不容易建立起的一系列ROS环境,被python3-rosdep2这条万恶的语句连同ROS一起给我删了。。。悲伤来的那么猝不及防    随着ROS版本的迭代,相关资料很多都不再适用

慕羽★的博客 3806

想在 Visual Studio Code 里进行 ABAP 开发,需要安装的扩展列表

安装完毕后,我们可以将 SAP 系统配置为 Visual Studio Code 连接的远程文件系统。为了连接到 SAP 系统,需要启用 ABAP 开发工具 (ADT) ICF 节点,这与 SAP Hana Studio 等工具使用的服务相同。打开 SAP GUI 并连接到目标系统,运行事务 SICF,然后激活 ADT_SRV 服务,如下所示。这启用了允许代码编辑器和 IDE 连接到 SAP 系统的服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3117

完全自学C(干货) —— 函数

即子程序,是大型程序中某部分代码,由一个或多个语句块组成,通常被集成为软件库;

NapoleonCoder的博客 380

3D视觉实战之双目相机物体尺寸实时测量

视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。

qq_53545309的博客 2098

完全自学C(干货) —— 数组

一组相同类型元素的集合,可存储一系列相同类型的数据;

NapoleonCoder的博客 1153

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

完全自学C(干货) —— 常量、变量

常量:不能改变的量,在程序的运行过程中,不能变化的量; 变量:能被改变的量,在程序的运行过程中,可能会改变或者被赋值的量;

NapoleonCoder的博客 366

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【方法分享】准大学生如何自学C语言?

准大学生如何自学C语言 文章目录准大学生如何自学C语言一、找寻一个优质教学视频二、使用优质编译器三、安排一个电子笔记需不需要一个ipad来辅助学习?结语 虽说现在已经接近我们最长的且无忧无虑的暑假的尾声 但我估摸着很多小伙伴还是和我一样整天摸鱼,不知不觉就浪费了一天 (其实只有我在摸鱼对吗,流下了不争气的泪水) 不扯这些没用的,进入今天的正题 本篇博客和大家分享一下我是如何自学C语言的,以及如何做学习笔记 学习方法各不相同,请以自身情况为准 一、找寻一个优质教学视频 好的教学资源永远是我们学习的第一步 在这

慕雪华年的博客 3178

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

给自学编程的少年们的一点小干货

适合自学的同学的干货      注意关键字,自学,整天上网看教程视频的,右上角,谢谢。     喜欢编程的和自学能力强的,其实根本不用去网上看所谓的教学视频,书籍,前辈们的经验,都可以看看, 当然我并不是说我自己有很强的自学能力,因为嘛,当初学C语言的时候,书上说入门到精通,只要21天,可是 我用了两个月也只能写个图书管理系统,(PS:现在才学了3个月,说我没能

AA_XB_AA的博客 454

完全自学C(干货) —— 预处理详解

预处理;

NapoleonCoder的博客 941

完全自学C(干货) —— 文件

文件名/文件指针/文件的打开和关闭/文件的顺序读写/文件的随机读写/文本文件和二进制文件/文件的结束判定/文件缓冲区;

NapoleonCoder的博客 543

0基础Java自学之路

前言 最近逛知乎的时候,经常看到有人在问“0基础如何自学Java”、“干了几年**,想转行干Java靠谱吗”等问题。不禁让我回想起了自己当初自学Java的日子,因此在这个周末花了点时间,整理了这篇文章,希望对这些正打算自学Java的或者打算转行Java的人有点帮助。 我的自学之路 先告诉你们我的自学过程可能让你们有点参考。 大三的时候,班主任请了2个已经拿到offer的实验室同学来跟...

程序员囧辉 3万+

自学C语言的五大误区:为什么有人3个月放弃,有人却能成为高手?

C语言作为一门经典且强大的编程语言,在系统软件、嵌入式开发、游戏开发等众多领域都有着广泛的应用。许多人怀揣着对编程的热情踏上了自学C语言的道路,但结果却大相径庭:有的人在短短3个月内就选择放弃,而有的人则能逐渐成长为编程高手。造成这种差异的原因,很大程度上在于是否陷入了自学的误区。本文将为你揭示自学C语言的五大误区,帮助你避开陷阱,更高效地学习C语言。

星辰夜语的博客 1107

完全自学C(干货) —— 选择、循环结构

顺序结构,选择结构,循环结构;

NapoleonCoder的博客 471

0 基础 Java 自学之路(2021年最新版)

屌丝逆袭之路

程序员囧辉 41万+

完全自学C(干货) —— 关键字

关键字;

NapoleonCoder的博客 311

完全自学C(干货) —— 结构体初识

是一些值的集合,这些值被称为成员变量;

NapoleonCoder的博客 344
上一篇: 完全自学C(干货) —— 内存操作函数
下一篇: 完全自学C(干货) —— 动态内存管理
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值