电脑文件夹加密、文件夹上锁、隐私保护的常用方法。
让你快速明白计算机编码中的二进制、八进制、十六进制。
官方产品:SkyLockBox 星空文件夹锁操作教程。
前三节课咱们把文件操作的基础都讲完了——打开关闭、四种读写方式、定位和状态检测。但知识这东西,光学不练等于白学。今天这节课,咱们要把前面学的东西全串起来,写一个真正能用的小项目。
前面两节课,咱们把文件的打开、关闭、读写都讲完了。但有个问题一直没解决——文件读着读着,你怎么知道读到哪儿了?
上节课咱们把文件打开了,也学会了怎么关闭。但光打开不干活,那不是白开了吗?这节课咱们就讲怎么往文件里写东西,怎么从文件里读东西。
咱们开始讲文件操作。这是C语言里实用性最强的一块,学完了你写的程序就能“记住”东西了,不再是关掉就啥都没了。
今天说个“辅助型”的知识点——typedef。这东西不复杂,说白了就一句话:给已有的类型起个新名字。 但你别小看它,实际开发里用好了,代码的可读性能上一个台阶。
枚举这玩意儿,说白了就一句话:给一堆整数起名字,让代码好读。
共用体是啥?用一句话说就是:好几个成员,挤在同一块内存里。 你改了其中一个,另一个也跟着变——因为它们压根就是同一块内存,只是换了个名字而已。
前面咱们把C语言自带的基本类型和派生类型都学完了。但你现在想想,如果要描述一个“学生”,你有啥办法?
前面咱们把指针、动态内存分配都啃完了。今天这节课,是把前面所有知识全部串起来的终极实战——链表。
前面咱们把指针的基础、指针和数组、指针和字符串、函数指针、返回指针的函数全聊完了。今天终于到了指针的“终极实战”——动态内存分配。
前面咱们把函数指针讲完了,那节课说的是“指针指向函数”。今天咱们反过来——函数返回一个指针。
但今天我要告诉你一个更神奇的事儿:指针不光能指向数据,还能指向函数。
今天咱们讲指针和字符串。你先别觉得这是新东西,字符串本质上就是字符数组,只不过末尾多了个\0。所以指针和数组的那套玩法,直接搬到字符串上就完事了。但字符串有几个自己的脾气,今天咱们专门说说。
今天咱们要讲指针和数组的关系。我先把结论放这儿:数组名本身就是一个地址,而且它就指向数组的第一个元素。 你一旦把这个搞懂了,指针和数组之间的那层窗户纸就捅破了。
指针是C语言的灵魂,你学不会指针,C语言就等于白学。学明白了指针,你才能真正理解什么叫“直接操作内存”,才能在数据结构、操作系统、嵌入式这些领域站住脚。
前面的课咱们把函数的基本用法都讲透了。但还有一个事儿一直没聊——这个函数是不是谁都能调?我写的函数只能在当前文件里用,还是别的文件也能用?
前面几节课咱们把函数定义、调用、参数传递都说完了。但有一个事情咱们一直没细聊——变量在内存里到底是怎么存放的?函数执行完了,变量去哪儿了?为什么有的变量你出了函数就找不着了,有的变量却能一直活着?
上节课咱们讲值传递的时候说过:你把变量传给函数,函数收到的是它的“复印件”,在函数里面改,外面不变。你传一个整数,传一个浮点数,都是这么个道理。但是有个东西特别奇怪——数组。你传一个数组给函数,在函数里面改了数组的元素,外面的数组也跟着变了。这到底怎么回事?今天咱们就把这个事彻底讲明白。
前面几节课咱们把函数怎么定义、怎么调用、怎么传参数都聊透了。今天咱们说两个新东西:一个是“套娃”,一个是“自己喊自己”。
前面几节课,咱们把函数的定义、调用、声明都聊透了。这节课咱们来说一个几乎所有学C语言的人都会困惑的问题:为啥我把变量传到函数里改了,出来之后它还是原来的值?
上节课咱们学了调用函数,大家发现一个有意思的事没有?就是printf和scanf这些函数,我们在main函数里直接就调用了,编译器也没报错。但是你定义一个自己的函数,如果在main后面实现,编译器就报错说不认识。
上节课咱们学了怎么盖工厂(定义函数),这节课咱们就来说说怎么让工厂开工干活——也就是函数的调用。
上节课咱们说了,函数就是一个小工厂,你把原材料扔进去,它在里头给你加工,完了把成品吐出来。那这节课咱们就来讲讲,在C语言里,这个“小工厂”到底是怎么盖起来的——也就是函数的定义。
当我们学会了用顺序结构、循环结构、分支结构等知识点编程解决问题后,为什么还要引入函数的概念,其作用是什么?
打个比方你就明白了。你搬家的时候买纸箱子,有的箱子用来装书(小而重),有的用来装衣服(大而轻),有的用来装碗碟(怕碎)。如果你用装书的箱子去装衣服,装不下;用装衣服的箱子去装书,又太大太浪费。C语言里的数据类型就跟这个道理一样——它告诉编译器两件事:这个变量占多大内存,以及这块内存里的数据要按什么规则来解读。
咱们上篇聊了常量,说它是"程序里雷打不动的值"。那变量就是它的反面——程序运行过程中可以随时改变的值。
说实话,常量在C语言里算是最基础的知识之一,很多教材把它跟变量放在一章里,几句话就带过了。但你要真把常量给整明白了,你写出来的代码可读性和安全性会好一大截。而且面试的时候,问到const和#define的区别,好多人答得稀里糊涂——就因为当初学常量的时候没上心。
前面咱们聊了数组、排序、字符串,这些都是C语言里的"基础款"。但说句实在话,这些内容学完之后,你对C语言的理解可能还停留在"用数组存数据、用循环处理数据"这个层面。真正让你对指针"开窍"的,是链表。
前面咱们把数组、查找、排序都聊完了。今天说字符串。字符串在C语言里是个特殊的存在——它没有自己的变量类型,全靠字符数组加一个\0来硬撑。这个设计让字符串的操作既灵活又容易翻车。
排序这东西,不管你是考试还是面试,基本躲不开。但凡讲到算法,排序必然被拉出来遛一圈。为啥?因为它能同时考察你对循环、数组、递归、时间复杂度这些综合能力。说白了,能把排序讲清楚,说明你C语言的基本功是过关的。
查找这玩意儿,你写程序的时候天天都得用——用户输入一个学号,你得在名单里找到这个人吧?登录的时候输入用户名,你得去数据库里查有没有这个账号吧?本质上都是"在数据里找东西"。
“暴力试”叫穷举,就是把所有可能性挨个试一遍,哪个对了就选哪个。“反复算”叫迭代,就是用一个公式或者规则,不断地用旧值算出新值,一步一步逼近最终结果。
今天说个特殊的——字符数组。说它特殊,是因为它跟字符串紧密绑在一起,而字符串在C语言里又是个“没有专用类型”的奇葩存在。
一维是一排格子,二维是一个表格。那三维呢?你把一个表格叠起来,一层一层摞在一起,就变成了一块“魔方”。四维、五维呢?别慌,数学上确实存在,但C语言里你几乎用不到超过三维的数组。真要用到四维以上,那多半是算法竞赛里的偏门题或者某些科学计算库,平时写代码压根不会碰。
一维数组咱们上一篇聊透了,就是一排格子排排坐。那二维数组是啥?说白了就是一排排格子叠起来,成了个表格。你把它想象成一个Excel表格,有行有列,想定位哪个格子,得告诉人家第几行第几列。
数组这东西,说简单也简单,就是一排相同类型的数据整整齐齐排好队。说难也难,尤其是跟指针搅和在一起的时候,能把人绕晕。今天咱们先把一维数组彻底搞明白,不扯指针那些有的没的,就专心把数组本身怎么用、怎么玩、常见算法有哪些,一五一十说清楚。
说实话,顺序结构可能是C语言里最不起眼的东西。循环和分支好歹有语法要点,有各种坑,写文章还能写出花来。顺序结构呢?不就是从上到下一行一行执行吗?这有啥好讲的?
很多人觉得分支结构比循环简单,if-else嘛,不就是二选一?switch-case嘛,不就是多选一?结果真写代码的时候,要么条件写得乱七八糟,要么switch里忘了break搞得一团浆糊。 说白了就是没真正理解分支结构的执行逻辑,光记住格式了。
任何稍微有点实际意义的程序,都离不开循环。你想想,让你算1加到100,没有循环你不得写到天荒地老?让你从一堆数据里找到最大值,没循环你只能干瞪眼。
学C语言最怕什么?最怕学完了一学期,能看懂每行代码在干啥,但让自己从头写个东西就抓瞎。或者考试能过,但面试一问“指针和数组有什么区别”就支支吾吾。
到底应该先学习哪个程序设计语言?
我们为什么要认真学习C语言,不是为了应付学校,而是它真的十分有用。