上一章节一、C速通秘籍—C语言基础-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146002496?spm1001.2014.3001.5502本章节代码cPart2 · CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppstudy/tree/master/cPart2目录上一章节本章节代码一、数组1、数组的定义与使用1.1关于数组大小的三点说明1.2、二维数组和多维数组二、指针指针的本质指针相关的运算符二级指针和多级指针三、函数函数定义函数调用函数的作用函数的参数和返回值四、结构体结构体的定义结构体变量的定义和使用结构体的作用五、共用体使用场景较少共用体的定义共用体变量的定义和使用下一章节一、数组数组可以形象理解为一个整齐放置盒子的架子每个盒子里放置了一种定义好类型的数据每个盒子有自己的编号编号为整型从0依次往上递增。1、数组的定义与使用类型 数组名[数组大小]int number[5];1.1关于数组大小的三点说明1、数组若在定义时不给数组赋值则必须要指定其数组大小且数组大小为常量可以是数值常量也可以是普通常量这里就可以联系上面例子列举放盒子的架子一样如果都不知道有多少个盒子那么数组这个架子该如何创建大小。2、数组若定义时就给初始化赋值了如下int number[]{1,2,3,4,5};这里就已经指定了多少个放数据的盒子所以这里就可以不需要对数组大小进行说明。3、除了上述两种当数组作为形参时不需要指定大小。形参可以先记下后续函数中会讲解void printArray(int arr[]) { // 函数体 }1.2、二维数组和多维数组二维数组一维数组构成的架子垒起来按照行进行存储数据二维数组中可以把 行数省略列数不能省略int a[4][4]; int b[][4] {1,2,3,4,21,22,23,24};多维数组a[][3][4]....:只能省略第一个[]中的数// 数组 int a[10]; for(int i 0; i 10; i) { a[i] i*10; } printf(arr a size : %d\n, sizeof(a));// 获取数组所占字符数 int b[SIZE]; for(int j 0; j SIZE ; j) { b[j] a[j] / 2; } float fArr[] {3.4, 4.5, 6.6}; int num[2][4]; int nn[][2] {1,2,3,4,21,22,23,24}; // 多维数组初始化后可以不指定第一维大小二、指针指针可以理解成是一个特殊的“身份证”这个身份证上记录着某个东西存放的位置以及这个位置的名称。指针的本质在计算机的内存里每个存储单元都有一个独一无二的地址就好像每个房间都有一个门牌号一样。指针就是用来存放这些地址的变量。例如int num 10; int *p; // 指针的定义 p num; // 这个符号时取地址将地址值付给指针P printf(%d\n, *p); // *这个符号表示取值表示将P这个地址下的值取出来。 printf(pointer size:%d\n, sizeof(p)); // 获取指针大小32位系统就是4个字节64位系统就是8个字节 printf(pointer %p\n,p);//%p表示按照16进制的形式输出指针用来存放内存地址因为在同一个系统下指针的大小是固定的比如在32位系统下指针对应的大小就是4个字节。指针相关的运算符取地址运算符运算结果为操作数的指针*指针运算符运算结果为指针所指向的数据的引用指针进行 /-运算。int *p; // 指针的定义 p num; // 这个符号时取地址将地址值付给指针P printf(%d\n, *p); // *这个符号表示取值表示将P这个地址下的值取出来。 printf(pointer size:%d\n, sizeof(p)); // 获取指针大小32位系统就是4个字节64位系统就是8个字节 printf(pointer %p\n, p);//%p表示按照16进制的形式输出指针地址。 int data[4] {3,4,5,6}; int *pNum data; // 数组名为指针数组名是指针常量不能改变。 pNum; printf(pNum - value: %d\n, *pNum); // 指针 表示指针所直指向的内存地址增加了一个int型数据的间隔。所以这里输出 4 int *pData data[3]; // 将数组的第四个数据地址赋值给pData; pData - 1; printf(pData - value: %d\n, *pData); // 指针-1表示指针所直指向的内存地址减少了一个int型数据的间隔。所以这里输出 5 // 指针在进行加减时要注意不要访问越界。指针常量指针类型的常量指针本身市场量:一旦定义就不能被赋值、改变但是可以改变指针所指向的数据。常量指针常量的指针指针指向的是常量它被指向的一个数是一个常量在指针看来也就是说通过p无法去修改它所指向的地址的数据但是p本身是变量可以对他进行赋值更改常量指针常量指针本身是常量指针指向的也是常量定义的标识符是个常量的指针所以他的值不能任意改变也就是他所指向的地址值不能变同时由于他是一个指针型的常量所以他对应的地址的值不能是赋值只能读取。二级指针和多级指针二级指针指针的指针即指针变量的地址这里一般用于存放某个数据单元的地址的地址这样要修改这个地址下创建的地址可以这样使用建议不要用太多级指针。一般到二级就可以了否则代码可读性会大大降低从而增加调试理解难度。三、函数函数可以形象的理解为一个个小的 “工作车间”每个车间都有特定的任务能帮你把复杂的大工作拆分成很多小工作让程序更有条理。函数定义上面形象的把函数比喻成一个“工作车间”那么一个车间实现某个具体功能时往往需要原材料即函数参数-》形参函数工作完了会输出一个结果或者是返回某个状态这里就有返回值跟出参的概念。例如下计算两数之和int add(int a, int b) { return a b; }int这是函数的返回类型说明这个函数做完工作后会返回一个整数。add这是函数的名字就像车间的名字方便我们后面调用它。(int a, int b)这是函数的参数列表也就是这个车间需要的材料。这里需要两个整数a和b。return a b;这是函数的核心工作内容把两个数相加然后把结果返回出去。函数调用函数的声明定义必须要在函数调用前这里很好理解若为进行声明定义那么调用处怎么会知道这个函数的组成。定义好函数后就可以在其他地方调用它就像在需要的时候去使用某个车间。比如#include stdio.h int add(int a, int b) { return a b; } void addOutput(int n, int m, int *sum) { *sum nm; n5; m10; if((*sum) 400) { addOutput(n,m,sum); // 递归调用 } } int main() { int result add(3, 5); printf(两数之和是: %d\n, result); int sum 0, k 66; addOutput(result, k, sum); // 这里的sum是出参 result/k,为入参 返回值为void printf(sum: %d, k %d, result%d \n, sum, k, result); int (*pAdd)(int, int); // 函数指针 pAdd add; int ret pAdd(39,45); printf(ret: %d\n, ret); return 0; }函数的递归调用即在函数执行代码段中的某一个环节继续调用该函数这里要注意递归要设立退出机制不能让函数一直处于递归调用循环的状态。函数的作用代码复用如果有一段代码需要在不同的地方多次使用就可以把它写成一个函数。这样每次需要用的时候直接调用函数就行不用重复写代码。比如上面的add函数在很多地方要计算两数之和时都能调用它。模块化设计把一个大的程序拆分成很多小的函数每个函数负责一个小任务。这样程序的结构会更清晰也更容易维护和调试。就像一个大工厂分成很多小车间每个车间负责一部分工作管理起来更方便。函数代码太长要进行拆分成小的功能模块。函数的参数和返回值函数的参数就是如上面的 int a, int b,这里为函数的形参按照功能又可以分为入参跟出参比如这里的sum就是出参传递的是指针在函数执行完后指针指向的位置值发生了修改而另外两个参数的值不发生改变。返回值函数可以有返回值也可以没有返回值返回类型为void。返回值就像是车间产出的产品函数做完工作后把结果返回出去。如果函数不需要返回结果就用void作为返回类型。函数指针函数名为函数的指针。四、结构体结构体就像是一个 “收纳盒”可以把不同类型的数据收纳在一起形成一个新的数据类型。结构体的定义定义结构体就像是设计一个收纳盒要说明这个盒子里可以放哪些东西。比如你想设计一个收纳盒来存放一个人的信息包括姓名、年龄和身高就可以这样定义struct Person { char name[20]; // 姓名 int age; // 年龄 float height; // 身高 };结构体变量的定义和使用定义好结构体后就可以用它来创建具体的变量就像按照设计好的收纳盒样式做出一个个实际的盒子。例如#include stdio.h #include string.h struct Person { char name[20]; int age; float height; }; int main() { // 定义一个结构体变量 struct Person p1; // 给结构体变量的成员赋值 strcpy(p1.name, 张三); p1.age 20; p1.height 1.75; // 输出结构体变量的成员值 printf(姓名: %s\n, p1.name); printf(年龄: %d\n, p1.age); printf(身高: %.2f\n, p1.height); return 0; }结构体的作用组织数据当需要处理一组相关的数据时把它们放在一个结构体里能让数据的组织更有条理。比如上面的例子把一个人的姓名、年龄和身高放在一个结构体里方便对这个人的信息进行管理。函数参数传递可以把结构体作为函数的参数传递这样就能一次性传递多个相关的数据。例如写一个函数来打印辆车的信息#include stdio.h #include string.h struct Person { char name[20]; int age; float height; }; typedef struct car{ char name[20]; // 名称 float wight; // 宽高 float height; char colorChr[20]; //颜色 }CAR; void printCar(CAR C1) { printf(品牌: %s\n, C1.name); printf(颜色: %s\n, C1.colorChr); printf(高: %.2f\n, C1.height); printf(宽: %.2f\n, C1.height); } int main() { // 定义一个结构体变量 struct Person p1; // 给结构体变量的成员赋值 strcpy(p1.name, 张三); p1.age 20; p1.height 1.75; // 输出结构体变量的成员值 printf(姓名: %s\n, p1.name); printf(年龄: %d\n, p1.age); printf(身高: %.2f\n, p1.height); // 定义一个变量车 CAR C1; strcpy(C1.name, 奔驰); strcpy(C1.colorChr, red); C1.height 1.7; C1.wight 2.2; printCar(C1); return 0; }注意在暴露给外部调用时尽量不要使用结构体传参数这样针对只是少数值修改时不需要创建整个结构体对象。五、共用体使用场景较少在 C 语言里共用体也叫联合体就像是一个特殊的 “小房间”这个房间每次只能住 “一个人”也就是每次只能存放一种数据但可以存放不同类型的数据。共用体的定义定义共用体就像是设计这个特殊的 “小房间”要说明这个房间可以让哪些 “人” 住进来也就是能存放哪些类型的数据。比如你设计一个房间它既可以让一个整数 “住”也可以让一个浮点数 “住”就可以这样定义union Data { int i; float f; };union这是定义共用体的关键字。Data这是共用体的名字就像房间的名字方便后面使用。大括号里的内容就是这个房间可以容纳的数据类型这里有一个整数i和一个浮点数f。共用体变量的定义和使用定义好共用体后就可以用它来创建具体的变量就像按照设计好的房间样式造一个实际的房间。例如#include stdio.h union Data { int i; float f; }; int main() { // 定义一个共用体变量 union Data d; // 给共用体变量的整数成员赋值 d.i 10; printf(整数的值: %d\n, d.i); // 给共用体变量的浮点数成员赋值 d.f 3.14; printf(浮点数的值: %.2f\n, d.f); printf(整数的值: %d\n, d.i);// 这里整型数据已经被覆盖 return 0; }在这个例子中union Data d;创建了一个名为d的共用体变量。然后通过.操作符来访问共用体变量的成员给它们赋值并输出。要注意每次给一个成员赋值后之前存的数据就会被覆盖因为这个 “小房间” 每次只能住 “一个人”。共用体可以节省内存空间现阶段内存空间往往十分充裕因而共用体使用面就减少了。下一章节三、C速通秘籍—C语言内存管理-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146464330?spm1001.2014.3001.5501
企业数字化 ERP 产品动态
相关推荐
智慧职教刷课脚本:三步轻松实现自动化学习 智慧职教刷课脚本:三步轻松实现自动化学习 【免费下载链接】auto-play-course 简单好用的刷课脚本[支持平台:职教云,智慧职教,资源库] 项目地址: https://gitcode.com/gh_mirrors/hc/auto-play-course
智慧职教刷课脚本是一款专为职业教育学生设计的智能自动… · 2026/9/18 22:44:35
Windows系统终极指南:3分钟快速安装draw.io桌面版免费绘图工具 Windows系统终极指南:3分钟快速安装draw.io桌面版免费绘图工具 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop
还在寻找一款功能强大且完全免费的绘图软件吗&#x… · 2026/9/12 22:24:25
数组与链表的内存模型与性能对比分析 1. 数组与链表的本质差异:从内存模型说起 第一次接触数据结构时,我也曾被数组和链表的区别困扰。直到在调试器里看到它们的内存布局,才真正理解这两种结构的本质差异。让我们从最底层的存储方式开始,逐步拆解它们的特性。
1.1 内… · 2026/11/5 10:23:42
AGI时代智慧主权与《全球智慧文明宪章》技术解析 1. 项目背景与核心议题 2026年AGI(通用人工智能)技术突破临界点,全球范围内出现首个通过图灵测试的自主意识体。这一里程碑事件引发各国对"智慧主权"概念的激烈辩论——当AI系统具备自我意识后,其创造者、部署国是否天然… · 2026/11/5 10:23:42
3D R-Tree:高效时空数据索引技术解析 1. 3D R-Tree:时空数据索引的革命性解决方案 在当今数据爆炸的时代,时空数据的高效索引成为了一个关键挑战。想象一下,你需要在一个包含数百万移动对象的系统中快速查询"在特定时间段内经过某区域的所有车辆",传统的数据… · 2026/11/5 10:23:42
JavaFX启动界面实战:自绘Stage、真实进度与淡出交接 1. 先把启动界面这件事拆干净 JavaFX 启动界面看着是个小事:一个 600380 的窗口,一张图、一根进度条、一行状态文字,半天画完。真动手做才发现,难的不是画,是 它出现和消失的那两个瞬间 ——窗口出现时不能白屏、不能… · 2026/11/5 10:23:42
FastAPI接口限流实战:从原理到Redis实现 1. 为什么需要接口限流? 上周隔壁团队的服务又被刷爆了,原因是某个新上线的接口没有做限流防护,被脚本疯狂调用导致数据库连接池耗尽。这让我想起三年前自己踩过的类似坑——当时一个公开API被恶意爬虫以每秒200次的频率请求,直接… · 2026/11/5 10:23:41
LeetCode高频题:从前序与中序遍历序列构造二叉树 1. 问题背景与核心挑战 这道LeetCode高频题目要求我们根据二叉树的前序遍历和中序遍历序列,重建原始的二叉树结构。作为数据结构与算法领域的经典问题,它在各大科技公司的面试中出现的频率极高。我在准备面试时曾反复研究这个问题,也在实际工… · 2026/11/5 10:20:40
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38