c 语言里面的换行服除了换行的作用,还有没有其他用途?下面我们来写个代码,内容很简单,一个负我循环,循环三次,每次输出变量挨得直,然后睡眠一秒。这个程序的现象应该是什么样的? 很多同学应该会回答,先输出零,等一秒再输出一,再等一秒输出二。其实并不是这样,把代码运行起来,你会发现程序并没有输出,直到三秒后一下子输出三个数字,跟你想象的好像不一样。 然后把程序改一下,在 printerf 里面加上换行服,再运行一遍。这次看到的现象跟我们想象的一样,为什么呢?因为 c 员中的换行服除了起到换行的作用,还有刷新缓冲区的作用。其实在我们程序和屏幕之间还有一个叫做缓冲区的 东西,目的嘛,就是为了提高 io 效率。这个我们后面再讲。每次调用 printerf, 程序都会把数据写入到标准缓冲区,并不会直接显示在屏幕上,除非这个数据的后面有换行服,或者缓冲区满了,再或者进程正常结束才会刷新缓冲区。 所以刷新就是把缓冲区里面的数据写到磁盘上,当然这里指的是屏幕,并且把缓冲区里面的数据清除掉。所以在使用 printerf 函数的时候,能加换行服就把换行服加上,养成习惯,尤其是在调试代码的时候,加不加换行服效果完全不一样。
粉丝6.0万获赞33.6万


一定要会用 clean 函数彻底告别复制粘贴,要把这种带有换行符的文本合并成一行,就直接输入等于可令函数。接着点击前面单元格, 补齐括号回车,再向下拖动填充。注意,这里有很多空格怎么办?只要在公式前面嵌套 trim 函数,补全括号回车,向下拖动填充搞定!简简单单,你学会了吗?

写论文时不自觉的会按很多回车键,散落在几十页的论文中,最后交底稿时发现这些回车键很占篇幅。今天教你一招,一秒删除所有容易的换行视力文本。有两页,实际上有用的文本没多少字数。现在快捷键 ctrl 加 g, 打开查找和替换对话框,切换到替换标签页,点击更多复选框,选择使用通配符。关键点来喽!查找内容中输入以下内容,拖字符加十三在 word 中代表的是段落标记,即输入 enter 键使产生的字母。 实际上十三是 ask 码表中的回车符 c、 r。 而在 windows 下的纯文本中,渐入安尘会产生两个符号,回车符 c、 r 以及换行符 l f。 接下来在替换为中填入托字符加十三,点击全部替换。 很好,果然浓缩就是精华。关注我,学习更多办公软件小知识!

大家好,这里是老牛之前我们发布过使用查找和替换的方法来清除数据中的换行符,有的朋友就反映呢,使用这个方法,有的换行符是清除不掉的,就如在这个表中, 我们可以看到数据确实是有分行的,如果使用查找和替换换行符,以 ctrl j 输入换行符来替换,全部发现找不到这个换行符。 那遇到这种符号我们怎么办呢?我们可以使用一个函数叫做 clean, clean 函数只有一 一个参数,就是需要清除一些非打印字符的文本。在这里我们选择 b 二单元格,回车确认,双击向下填充,然后将数据复制粘贴为数值, 我们再回到 c 二单元格,看到转换后的数据就没有换行符了,这个公式你记住了吧?欢迎关注老牛说 excel。

有多少同学知道,如果文章段落是复制粘贴的,那么打开显示隐藏编辑标记,就会显示这种向下的小箭头, 这样导师一眼就能看出来,分分钟给你打回来。学姐教你们把它们都消除掉。我们按住 ctrl 加 h 查找和替换查找内容,点特殊格式,找到手动换行符,替换为选择段落标记,点击全部替换,向下的箭头就变成回车键符号了, 这样导师就看不出来复制粘贴的痕迹了。如果觉得太麻烦了,其实学姐还有一招,这个辅助工具,只需要你把文章标题和研究思路填进去,再把从知网复制的参考文献粘贴上,或者工具也会推荐高相关性的文献供你选择。深层随意添加图标公式的大纲, 根据学校要求进行润色修改,这样写出来的文章格式规范严谨,逻辑清晰,只要第一印象分拉高了,后面流程就顺利一大半。

哈喽,大家好,今天聊的知识点是转移字母。你是不是也对代码里那些像反斜杠 n、 反斜杠 t 这样的符号感到困惑,他们到底是什么意思?别担心,今天我就用最通俗的语言带你彻底搞懂他们。 首先我们来搞清楚第一个问题,什么是转移字母?简单来说,转移字母就是一个信号兵,它的标志就是一个反斜杠。当计算机看到这个反斜杠时,就知道,哦,后面这个字母不简单,我得特殊处理一下。 就像我们平时聊天说个狗头,大家都知道是开玩笑,而不是真的在说狗的头。比如这行代码,反斜杠 n 就 不是单纯的字母 n, 而是一个换行指令。 最长义的转移字母之一就是反斜杠 n, 它是妞烂的缩写,意思是新的一行,它的作用非常直观,就是让输入的内容换到现一行显示。比如我们看这个例子, ctrl 第一行,反斜杠 n, 第二行运行后,第一行和第二行就分别显示在两行,而不是挤在一起。 接下来是制表符反斜杠 t, 它是退步的缩写,它的作用就像我们按键盘键向的退步键一样,能让我们输出的内容自动对齐,看起来非常整齐。比如我们要输出一个表格,用反斜杠 t 分 格姓名和年龄,就能轻松实现对齐效果,让数据一目了然。 我们知道双引号是用来定义自复串的,那如果我们想在自复串里面也显示一个双引号怎么办呢?直接写肯定会报错,因为计算机会以为自复串提前结束了。这个时候我们就用反泄杠来转移它,告诉计算机这个引号是内容的一部分,不是结束符。 同理,如果我们想在字复串里面显示反斜杠本身,比如写一个文件路径,该怎么办呢?因为单个反斜杠是转移的,所以我们需要用两个反斜杠来表示一个真正的反斜杠,这时计算机就不会把它当成转移信号了。 还有一个比较有意思的转业符号是反斜杠 r, 它是回车的意思,它的作用是把光标移到当前行道开头,但不换行。所以如果你在它后面输出新内容,就会覆盖掉当前行前面的内容,这在做一些动态效果,比如进度条的时候非常有用。 最后给大家介绍一个终极神器,竹字字母串,只要在字母串前面加一个艾特符号,里面所有的转移字母就都失效了,你写什么,计算机就原封不动输出什么。比如写文件路径,用竹字字母串,就再也不用写双反斜杠了,非常方便。 好了,今天的内容就到这里,我们来回顾一下今天的几个核心转移字体。反斜杠 n 是 换行反斜杠, t 是 对齐反斜杠。双引号和双反斜杠分别用来显示引号和反斜杠。反斜杠二能让公标回到行首。 还有一个拦人神器艾特可以取消所有转移,这些知识点都非常实用,希望大家都能掌握。怎么样,这些转移字体是不是没有那么难了? 他们在编程里非常常用,掌握他们能让你的代码变得更加灵活和强大。如果觉得今天的内容对你有帮助,别忘了点赞关注我,你们还想知道哪些有趣的转义词符或或者编程技巧?欢迎在评论区留言,我们下期再见!

这是一个很好用也很简单的函数,它能帮你批量的删除表格里面所有的换行符,这里是含有换行符需要拆解的原文,想要把它们快速的拆解出来,用 clean 函数,这个函数只有一个参数,选中谁就拆解谁, 按回车右下角双击填充公式,全部的换行符都删除掉了。这个函数特别适合处理从系统导出数据,出现格式问题,你学会了吗?有用的话记得点点关注点点赞哦!

大家好,我是程云,这节课我们来说一下交错数组,我们怎么去定义,定义交错数组的话呢?就是声明, 声明交错数组啊,怎么做呢?它有一个语法 数据类型啊,然后他后面是跟了两个纵块啊,如果是一个纵块的话呢,就表示是一维数组,两个的话呢,就是啊,交错数组后面跟数组名即可 啊,这样子的话呢,他就已经生成了一个交错数组,所以这个地方大家一定要记住了啊,他跟英文的区别,我们重新来捋一下英文数组,英文数组就是数据类型中括号啊,然后数组名,然后这个呢反而是两个中括号啊,这是他们的一个区别。 那现在我们来写一下,给我来个 int 两个中文号 a r 啊,目前为止呢,我已经升为了一个交错数组了啊,那然后在内存里面呢,它是一个什么样的变化呢? ok, 我 们来看一下啊,什么样的变化, 那么它目前为止就声明这个的话呢,它跟异维其实是一样的,比如这是占内存啊,那我们后面呢肯定会有一个堆内存。 ok, 然后我们代码的话呢,刚才写了一下 area 啊,这是我们刚才写的一个代码。 好啊,那目前为止呢,这里边呢就是一个 area 啊,所以说整体来看的话,它跟 e 维的没有区别,这个是占内存,这个是堆内存。 好,那么目前呢,我们的交错数组啊,已经是设定成功了。

让你把回车小箭头都删掉,你把键盘敲冒烟也删不掉。莫慌,看招,点击文件,选择选项,点击显示,找到段落标记,把这个勾选取消,再找到显示所有格式标记,把这个勾选也取消,点击确定,这不就搞定了。简简单单,这还学不会吗?

杰克给大家介绍 wps 文字和 word 当中换行符的概念用途,以及怎么样快速插入换行符, 这个功能在 word 和 wps 文字当中是一模一样的,这里呢以 word 为例给大家介绍。通常情况下,我们一段文字 结束了以后,习惯于按回车键,按回车键他就会生成一个这样的符号, 这样的符号就表示是分段了,接下来是从一段开始起,而假如说我虽然从这里另起一行,但是我仍然想跟前面的生成为一段是一段内容,将来我再设定行句啊,或者段间句 这种格式,设置的时候,或者我要快速选择的时候,我仍然可以跟他一起选择的话,我们就不能按回车键,因为回车以后就是生成了一个新的段, 所以我们如果不想成为新的段落,应该是插入一个换行符,在 布局页面布局选择分格符,分格符这里有一个自动换行符,自动换行符,那么就生成了一个换行符,有没有发现他是像类似于向下的一个箭头,这样他就跟下面是一段。 所以我们如果说使用了这个跨横幅以后,那我们选择比如说设定它的样式以后, 断落,断前断后的这个间距,断前断后的间距,比如说我断前是一行,断后是零点五行,那么使用了回车符的这种分段了以后,这个就会应用我们刚才设置的断前断后。假如使用的是这个换行符,而不是分段符,他仍然跟前面后面的内容 是视为同一段的,我们要快速选择也是一样,通常我们三 g 鼠标,他就会选择我们所在光标的这一段三 g 鼠标,但如果我们没有把它分成一段,我们同样的三 g 会选择整个这一段的内容啊。这个功能在 wps 文字是一模一样的, 所以换行符它的作用就是我一个段落当中我多行文字另起一行,但是我还是属于一个段落,就要用换行符,可以选择插入或者按 shift 加 enter, 注意 control 加 enter 是分 页,分页,呃, shift 加 int 是分行。换行符仍然属于一段,仍然属于一段。那这样的话,我设定段落之间的间距或者快速选择一段的时候就可以去使用。那有很多小伙伴可能会发现,我们从网络上复制,网页上复制的一些内容粘贴到 word 当中,经常后面变成了一个换行符,都是类似于 这种小的下箭头,但是我们实际上是希望他一段一段的。那怎么样快速的把所有的换行符变成分段符呢?下一节课我们给大家讲解 六分职场,持续为您提供高效办公软件、职场精进项目管理、 p n p 相关的知识、经验、技巧和资源。期待您的点赞、关注和评论,您的任何问题我们将尽心为您解答,六分职场,祝您成长!

我们来看一个编程题啊,然后也是一个跟字母串处理相关的一个编程题啊,在笔试里面出现的概率其实还挺高的啊,经常会遇见说将这么一个字母串啊倒置为这样子的啊,其实从这个例子我们也能看出来, 就是什么实现了句子的反转,但是这个单词是不是并没有被倒过来啊?对吧?啊?即句子中的单词位置倒置,而不改变单词内部的结构啊,这么一个题目啊,这个题目呢,其实解决的办法有很多很多,我们先来用一种最简单的办法吧,就是 上个视频跟大家讲解的那个叫做什么啊?时针数组,对吧?本质上呢是一个数组,然后里面呢是保存了好多个指针,对吧?用那个办法解决的话,我觉得是最简单的啊,画个图给大家看一下啊, 那这个时候呢,我们就得指定一下要输入多少个字母串了,比如说就按照刻件上写的那个有五个字母串,对吧?好,那我们就定一个数组, 数组里面呢有五个元素,那每一个元素呢?应该都是一个指针,对吧?每个元素都是应该应该是一个指。首先应该获取这五个字母串,对吧?那获取的这五个字母串不可能说把每一个字母串放在这个里面吧?这肯定不行,这个只有八个字节,对吧?如果你字母串长度超过八个字节呢?那不就越界了吗? 这个地方是用于存什么的呀?它其实用于存放的是指针,是吧?因为这个是一个指针数组嘛,所以它里面有五个指针,应该是指向五块空闲的内存,或者说可用的内存,那这个内存在哪呢?是不还得需要我们去申请啊? 于是呢,我们在获取之前,首先得申请五块内存,对吧?申请五块内存,然后呢,这五块内存地址记在这个数组里面,所以这个是一个整数组吗?那我们最终获得字串放在哪边?是不是都放在了这五块内存里面啊?能理解吧?那接下来呢,其实就是把这个, 呃,相当于是把这个数组里面的这些元素,我们做一个反转不就行了吗?所以这种办法呢,我觉得是比较简单的啊,我们直接来写代码吧。 好,我们就第一种解法啊,然后待会呢,我们还是这同样的一个题目啊,换一种解法再来试一下啊,名字呢,就叫时针数组反转吧啊,点 c return 零。 好,那接下来呢,我们首先要定一个指正数组,对吧?怎么定义的呀?是不是七二星 s t r 加一个中括号对不对?然后里面呢,如果是你需要五个字母,需要五个字母转反转的话,那你就写个五在里面,对吧,或者我们通过红丁异来写。行啊,那这样子待会改的话,方便一些吗? define size 五 好, size, 然后呢等于零,那这条语句啊,写个等于零表示什么意思啊?相当于是把这五个指征都抽象成了零,对吧?五个指征都抽象成零,那接下来呢,我们得写一个循环,是不是要获取五个字母串啊?等于零 i 小 于 size i 加加。那我们每次呢获取一个字母串吗?因为这个 scanf 它其实就是通过空格来区分的,对吧?空格或者换行都是可以的啊, 所以每次呢获取一个字母串,但如果你直接这样子写的话, s t r i 的 话,那这个时候程序就死掉了,为什么呢?你相当于是,呃,这个 s t r i 现在是什么? s t r 零,对吧?它是 now, 是 空指征,这里面五个数字都空指征啊,对不对?那你这个意思呢?就是获取一个字母串放在空指征里面,那这肯定不行嘛,所以呢,我们要在获取之前是不是先要申请内存啊? 好,申请内存,申请内存,那把这个地址放在 s t r i 里面吧,等于啊恰新 my lock size 恰,比如说乘以八十八个字节吧,够用就行了,对吧? 那这样子的话循环五次 mylog 申请了五块内存吗?对吧?我们其实最终是把这个字母串放在了这块内存里面啊,比如说你来一个 hello 啊 i 吧,就按照那个课间上面的啊 i, 然后这个是 m, 好, 再往下重复, 这边是四个字母串,对吧?啊?行,都行啊,随便。我们后面再来一个,比如说写一个 hello 什么的, 那这边一共有五个字母串,然后每个字母串地址是不是都记在了这个 s t r 里面啊,这个数组里面啊,对吧?那下面反转的话,只要把这个数组反转一下就行了吧?比如说 i 的 地址啊,我写两个吧,他是零 x 一 百,然后零 x 一 百呢,肯定放在这边, 那链子七百呢?放在这边我们要做的是不是就是把七百和一百相对调换一下位置就行了呀,对吧?那接下来呢啊,我们再来一个 循环,那这个只要循环多少次啊?把数组反转,只要循环一半次数就行吧,你看这这里面五个元素只要循环两次,对吧?一百和七百交换一下,然后这个跟这个交换一下是不就可以了呀?所以循环的次数呢,还等于零小于 size 除以二 i 再加取整嘛,取整二嘛。然后呢,就是一个交换啊,因为这个数族里面保存的是七二星类型,每一个都有时针嘛,对吧?那我们就来一个叫七二星 t 啊, t 等于 s t r i, 把这个 s t r i 给记下来,然后呢,它是不是要跟最后一个做交换啊,对吧?那最后一个应该怎么表示啊?这个的话,应该最后一个其实就是长度吧,就这个数组的长度吧,应该 s t r size, size 还得减一,因为 size 五嘛,最后一个应该是四才对,对吧?把它给谁呢?给 s t r i 等于最后呢? 最后 s t r, 然后 size 减一,等于原来的 t 吧,当然这个 s size 减一,是吧?不能说每次都是 size 减一, 不应该说每次都是最后一个,对吧?他是不是有一个向前移动的过程啊?先是第一个和最后一个交换,然后呢,第二个从倒数第二个,你看,从倒数第一个变成倒数第二个,他有一个向前移动的趋势吧,减去 i, 对 吧? 好,减去 i, 那 这样交换完了之后呢,数组里面呢?相当于是数组里面的地址就被换过来了嘛,对吧?我们只要打印的时候呢,看到的结果也是相反的,那下面呢,我们试一下啊,打印一下,再写一个负循环 i 小 于 size 打一下,加打一下,加好我们打印就行了啊。 print f 输出百分和 s 空格 s t r i 很 显然这个时候先出输出的应该是这个零 x 七百对应的字母串,对吧?那给我们看到的现象呢,就是反过来了嘛,每次输出完了之后啊,我们正好用这个 for 循环,怎么办?把那个 指征是不是释放掉啊,对吧?就是先输出连七百这个 hello hello, 输出完之后呢,把这个 hello 这个内存给释放掉,那其实用的就是 free 加上这个连七百就行了吗? s t r i, 对 吧?要不然的话就会造成内存泄露啊,所以呢,有始有终啊,申请内存用完了,把它给释放掉, 这是一个比较简单的一个写法啊,点斜杠一,我们来五个字母出来看一下啊, i am from 上海 hello, 你看结果是什么? hello, 上海 from m i, 对 吧?很显然把它给反过来了吧,只不过最后呢,少了一个换行了而已啊,我们加上一个换行了吧,在这边, 那这样子呢,其实就是实现了它的功能,而且非常简单,对吧?我们其实核心的算法就是这一块对数组做一个反转啊,所以说我们这个是用时针数组来进行实现的。 那还有一个问题,有些人可能会说啊,如果我要随机输入一些字母串呢?不确定他的个数呢?因为像这个的话,刚才指定了只输入五个字母串,对吧?如果不指定输入字母串的个数,那应该怎么办呢?也可以,我们完全可以把这一 整个当做一个字母串吧,对吧?然后呢,用空格是不是来区分每一个单词啊?对不对?所以接下来我们这个写法呢,就这样子啊,我们就把这整个当做一个字母串啊,好,下面再来写一个代码, 把这个整个当做一个字母串,思路是什么样子呢?我们先来看一下啊, i am from 上海,对吧? 那他的思路是什么样子呢?也很简单,比较常见的解法呢?就是先把这整个字母串逆序啊。字母串逆序什么意思啊?就是这个小写的 i 变成第一个, 大写 a 变成最后一个了,对吧?这个 a 呢,是不是变成第二个元素了呀?排在第二个,把这整个字母串反转过来,然后呢每一个单词再对它做一个反转,这样子也可以吧,对吧?也能实现最终的一个效果吗?那你看一下怎么区分不同的单词啊?很显然我们要便利字母串,对吧?定一个时针, 从第一个元素开始,然后呢往后走,你看遇到了空格,说明前面那个是一个什么?前面那个是一个单词,对吧?啊?遇到空格,说明前面那个就是一个单词嘛,对吧?所以思路呢是这样子的啊。

讲完了指征和数组的区别,我们下面来看一道笔试题啊,也是在笔试里面出现频率非常高的一道题目啊,然后这个呢不是一个编程的题目啊,是给你一个程序,然后问你这个结果是多少。 呃,这种题目呢,我们一般看到之后基本上都是要画图才能解决的啊,如果不画图的话,其实理解起来还是比较困难的啊,当然这个呢稍微要简单一些,还不是特别难的那种指征啊。 首先呢定一个数组,数组里面有五个元素,对吧?然后出画呢,分别是一二三四五啊,这个呢比较简单,五个元素,一个元素四个字节,对吧?好,画出五个元素 一二三四五。然后这个数字的名字呢是不是叫做 a 啊,对吧,里面保存的元素呢就是一 二三四五。好,这是一个数组, 那接下来呢就是三条语句啊,我们分别来看一下,第一个 int 新 p 一 啊,呃,定一个指征,其实下面就是定义了三个指针,对吧,分别叫 p 一, p 二, p 三, 只不过后面这个表达式呢有点复杂啊。然后首先我们来看一下第一个表达式,这边是一个取地址 a, 取地址 a 是 什么意思啊?对吧?在数组里面啊,在一为数组里面,我在这边写一下吧啊?取地址 a 表示的是数组的地址, 对吧?是整个数组的地址。呃,比如说我们这样子吧,去把这个地址都给写一下啊,假设这个一的地址是零 x 一 百, 那二的地址应该是多少?零 x 一 百零四对吧?三的地址呢?零 x 一 零八,那再往后呢,一零 c 幺幺零对吧?零 x 幺幺零啊,一共占了呃,二十个字节嘛, 取 d 值 a, 那 我问你,如果取 d 值 a, 它的值是多少?它的值其实就是零 x 一 百嘛,对吧?但是它的含义呢,跟 a 是 不一样的啊,虽然说我这边再来写一下吧,取 d 值, a 表示数组的地址,那 a 表示什么?表示 数族首元素的地址啊? a 表示的是数族首元素地址,它们俩的值是相同的,但是含义是不一样的,对吧?一个是表示数族的地址,代表的是整个数族,所以取地址 a 加一的话,应该直接加了二十个字节,相当于跳过了一个数族嘛,对吧?加到了下一个数族。 那如果 a 加一呢?他其实加的就是一个元素啊,因为 a 代表的是首元素的地址,对吧?所以他加一呢,就加一个元素,先把这些概念把它给搞清楚了啊, 要不然的话,下面这个题目就不好做了。来看一下,这边取的是 a 加一,很显然啊,取的是 a, 刚才我们说过了,表示的是整个数组,所以呢,如果啊,在我们这个图上取的是 a 加一,它的值应该是多少啊?应该是零 x, 你 看啊,幺零八,这个是幺零 c, 这个是幺幺零, 再加四的话,是不是就是幺幺四啊,对吧?所以取地址 a 加 e, 它的值应该多少?应该是零 x 幺幺四才对啊。所以这个地址在哪呢?应该是在这边啊,画出来应该是这样子的, 圈一下吧,应该是这块内存应该二十个字节,对吧?也是这么长啊,所以取地址 a 加 e 呢,表示的应该是我我选中的这么一块的地址,代表的是这么一整块,对吧?所以零 x 幺四,然后呢,他又把这个零 x 幺四转换成了 int 星, 这样子我们把它给画出来,这个的话放在下面吧。啊,放在这个地方,再往后呢,假设还有一个数组接在后面啊,其实是没有的啊, 这边呢,还有二十个字节,对吧?那取地址 a 加 a 连 g 幺四,其实表示的是什么?这一整个的数组, 对吧?这一整块的数组,然后呢,他把这个地址做了一个强制类型转换,转换成了 int 新类型,因为这个在 c 语言里面是强转嘛,对吧?把它强转成 int 新类型, 那 int 新类型 int 新是什么?是一个整形指征,表示的是一个整数,对吧?所以呢,值没变啊,强转在在 c 语言里面的强转值是不会变的,但是它的含义变掉了, 相当于变成了这个元素的地址啊,直接就变成元素的地址,原来呢,是整个是这一整块的地址啊,原来是这一整块的地址,现在呢,变成了这一个的地址,明白他们的区别了吧? 所以你看一下啊,那 p 一 呢,就是 p 一 是一个指征,应该就指向这个元素,对吧?那横线这个是一个,也指征了吗?因为我们定义的这个数组只有五个元素,对吧?你,你这个现在相当于是第六个元素了,已经是越界了,对吧?理论上是不能否认的。好,我们继续往下看, 然后再往后呢说啊,有一个 a, a 呢,并没有直接加 e, 而是他先把这个 a 怎么办?先把这个 a 做了一个强转把 a, a 是 什么东西呢?我们写在这个了, a 表示数族首元素的地址应该是 e 的 地址,对吧?它表示的 e 的 地址,说白了,这个 a 的 话就是零 c 版,而且是一个敞亮,是不能修改的数。族名是 是长整数吗?对吧?接下来把这个 a 转换成一个整数,那这个什么意思呢?就是说原来零 x 一 百表示的是一的地址,现在呢,它就表示零 x 一 百。这个整数啊,是个十六进制的一个数字, 然后零 x 一 百,那加一呢?是不是就变成零 x 一 百零一了呀?对吧?因为他转换了一个整数嘛,整数加一,那其实就相当于一加一嘛,一百加一是不是变成一百零一啊?对吧?接下来他又把这一百零一又做了一个强转,强转,指示不变的,但含义变掉了,所以一百零一呢,又变成了一个地址了,对吧?而且是一个整形的地址 啊,是一个整数的地址,所以这个 pr 应该指向哪呢?可以这么理解啊, pr 指向一百零一在哪啊?这 一的话是不是占了四个字节啊,对吧?指向了他的第二个字节,这个是 pr, pr 直接指向这个第二个字节。当然这种访问的方法是错误的,因为在 c 语言里面,如果想访问一个整数的话,一定是要从这个整数的第一个字节开始访问,也就是使用它最前面的那个地址, 这种写法呢,又是一个错误的写法啊。好,我们接着往下看,再往后呢,是一个错误的写法啊,那这个就是比较一个正常的一种写法了啊。 a, 我 们说是什么意思啊? a 表示的是数族首元素地址,对吧?那 a 加一呢?很显然就变成了一百零四吧,对吧?因为它表示的是一个元素的地址吗?它加一应该加一个元素 就变成了二的地址,一百零四,对吧?在我们这个图上就一百零四吗?然后把这个地址呢强转成 int 星,其实就算他不强转的话,他也是 int 星类型,对吧?所以 p 三应该指向谁啊?指向二啊,这个是 p 三。 好,这个就是 p 三。那你看一下,经过这三次赋值之后, p 一 p 二、 p 三是各纸箱一块内存啊,接下来他要干嘛呢? p 一 零, p 一 零其实就是在访问 p 一 纸箱的元素嘛。 p 一 零就等价于什么新 p 一, 对吧? p 二零呢?新 p 二, p 三零呢?新 p 三。你看一下,新 p 一 的话, 这个东西就不好说了啊,里面是一个随机值,对吧?我也不知道它里面到底装的是多少,有的时候呢,如果说很巧这块内存是被保护的,那直接这句话就断错误了,对吧? p r 呢,也是一个乱七八糟一个东西,因为他并不是正经的从这个第一个字节开始访问嘛,所以他访问的东西也是乱七八糟的东西啊。 p 三呢,应该就是二吧,对不对?好,那我们把这个结果看一下吧。啊, 我还是第八个,也是一个笔试训练啊, test 点 c 啊,我们直接粘贴就好了。 那下面分别打印三个数字,百分号 d, 百分号 d, 百分号 d, 换行啊, p 零, p 二零, p 三零啊,打印这几个数字 return 零。 呃,当然这边有一个警告啊,这个警告呢,不太好消除啊。不太好消除,因为这里面涉及到一个强转嘛。如果是在三十二位系统里面没有啊,因为六十四位,系统的话,指数和整数 转换的时候,因为纸,这是八个字节,整数四个字节啊,这个势必会改变里面的纸,对吧?从八个字节转换成四个字节的话,丢了四个嘛,所以他肯定会报一个警告出来的啊,但不影响,你看结果,是不是就直接断错误了呀?对吧?在这个里面直接不能访问了,我们再把它这样子啊,看一下到底是哪个断错误了。 有的地方,如果你是在红帽里面,我记得是没有断错误的啊,就算没有断错误,它其实也不是一个标准的写法。 p 二零。 好, p 三零, 你看一下第一个打印的是什么?三二七六四,对吧?这很显然也是一个不正常的一个数字,因为根本就没有三二七六四嘛,然后第二个没有打印出来。 p 二零在哪啊?看一下啊, p 二零,对吧?他打印的 p 一 零是三二七六四啊,其实这个地方呢,有有可能也会出现断错误,对吧?反正是一个随机值嘛, p 二零的话是不是死掉了呀?因为不支持这样的访问,对吧? p 三零应该能打印出来,如果把这个 p 二零注掉的话,你看一下啊, 他应该能把 p 三零给打印出来。 p 三零就是一个正儿八经一个二吗?对吧?所以只有这个 p 三纸上的内存是合法的,其他都不是合法的啊,这个笔试呢,在笔试当中确实出现的概率非常高。

我们在之前的视频里面一直在提一级地址,二级地址啊,对吧?或者说一级职称,二级职称,呃,但是我们那个说法其实并不是非常的准确啊,只是为了让大家更好的去理解这么一个概念,对吧?一级地址是元素的地址, 它的不长,是四个字节。二级地址呢?行的地址,对吧?取决于这一行有多少个元素。那三级地址呢?表示的是整个二维数族的地址,对吧?那这个二级地址真正意义上的二级地址在 c 语言里面存不存在呢?它其实是存在的啊,就是我们这节课要跟大家讲一下的, 叫做指征的指征,那这个指征的指征他其实怎么理解呢?我画一张图给大家看一下啊,这个其实理解起来比我们之前讲的那个二维数组那些,呃,对应的什么二级地址,我知道更容易理解一些啊。首先我们来这么一个代码,说 int a 等于 int a 等于一啊,那这个是一个非常简单一个代码, a 占四个字节在内层里面,所以呢,我把它给画出来,应该是这样子的啊,这个就是 a, 然后变量呢,叫做 a, 它占了四个字节,好从中间把它给分开,分开 再分开一下, a 占了四个字节。这四个字节里面呢,其实保存的就是一个整形数据一,对吧?因为一他是三十二位的嘛,一个字节是八位, 那 a 呢?有一个地址叫做零 x 一 百,如果我们现在想要把这个零 x 一 百保存下来,之前我们是怎么讲的呀?说来一个指征 int 等于取地址 a, 这样就可以了,对吧?那 p 呢?是一个指征,它是不是也要占内存啊,而且占八个字节的内存在三十二位的操作系统里面, 所以呢,我们再把它给画一下啊,我直接把这个复制一下吧,好,再复制一下。 好,就这样拼在一起吧,表示八个字节。好, 这样子,然后呢,这八个字节呢,名字叫什么?是不是就叫做屁啊,对吧?里面保存的值当然就不再是 e 了啊,而是 a 的 地址就是零 x 一 百,我们要把零 x 一 百,把它存在这八个字节里面,我就分开写吧,零 x e 百, ok, 这样子啊,所以呢,我们也会说,还有一种说法, p 是 一个指征,它是不是指向变量 a 呀,对吧?那新 p 呢,其实就是 a 嘛。 那同样还有一个问题啊,你说 p 既然占了八个字节,它自己有没有地址啊?当然也有地址啊,比如说叫零 x 一 千,可以吧。那现在如果想把零 x 一 千把它给记录下来应该怎么办啊? 只要是地址记录地址,我们就得通过变量去记录,于是这个时候呢,我就可以这样子来写了啊,心形 q 等于取地址 p, 你 看前面是不是多了一个心啊,为什么呢?你可以这么去理解啊, 第二个新号啊,我这样画一下吧,第二个新号表明 q 是 一个指征,只有这个意思啊,那前面这个的 int 星,你把它给连接起来,连接起来看,所以 q 是 一个指征,指向 int 星类型的数据,你看 p 是不是正好是 int 新类型的数据啊,对吧?那 q 占几个字节呢?你别管它是指征还是指征的指征,或者说什么指征的指征的指征,只要它是指征,在六十四位系统里面,它就占了八个字节,于是 这个变量的名字呢,就叫做 q, 好 理解吧,叫做 q, 然后里面保存的值是多少,就不再是零 x 一 百了,而是零 x 一 千 啊,零 x 一 千,因为他现在保存的是指征 p 的 地址吗?对吧?好,那这个时候你看一下,我们再用一个箭头指过去, q 是 一个指征,指向 p, p 呢,也是一个指征,指向 a, 所以 q 是 多少? q 是 零 x 一 千,对吧? q 是 零 x 一 千,新 q 呢,就是零 x 一 千里面的东西零 x 一 百。 那这个时候如果我要写这个星星 q 呢,对吧?星星 q, 我 觉得也很很好理解啊,星 q 是 什么?就是我选中的这个星 q 是 零 x 一 百,那星星 q 呢?相当于星零 x 一 百,那其实不就是 a 吗?对吧?星星 q, 它就是 a。 所以 职称的职称啊,理解起来还是挺挺简单的啊,没有多大的难度。那这个职称的职称有没有什么应用呢?有些地方真的会用到啊,我们再创建一个目录吧,就叫应该是十六了,因为是第十五个课时,没有写代码吗?我们只是纯粹的讲解 时针的时针 c d 十六,我们进来。好,然后我们写第一个,也就一个代码啊,写一个代码就行了啊,时针的时针点 c, 我 下面写这么一个代码,大家看一下有没有问题啊? c l u d int 慢 read 零,你看如果写一个恰新 s t r 等于空,对吧?好,接下来能不能往里面拷贝数据啊?很显然不能吧,因为空指征嘛,对吧?怎么能往空?空指征是根本就没有地址的意思,那么那怎么往里面拷贝东西呢?所以这个很显然是一个,应该是一个断错 误, l i b 点 h 以及 string 点 h 都包包含上,但是要用的啊, 这个代码很显然它是没有办法直接运行的,对吧?一运行就死掉了吗?我们试一下啊, g c c 一 杠 o 一 点斜杠一,你看一下啊,断错误。好,那下面,下面怎么办呢?我们来一个函数吧,给 str 分 配一块内存,叫做 int 函数。 str 可以 吧,就是在这个函数里面给 str 分 配一块内存。 好,然后我继续写代码啊,没有返回值啊,恰新 s 吧,换个名字叫做 s, 然后呢?因为不能,呃,因为不能使用这个局部变量,对吧?占空间函数结束之后要释放的嘛,所以我们在堆空间上面申申请吧。 my log size o 恰啊,乘以一八十八可以吧,也不需要返回了,因为是通过参数的形式嘛。 看好了,这个代码呢,乍一看啊,定一个指征等于空,然后呢,通过函数,在这个函数里面给这个空指征,相当于申请一块内存,把这块内存的地址复制给了这个空指征,对吧?那他就不再是一个空指征了吗?然后呢,把 hello 拷贝进去 一看呢,这个代码好像没有什么问题,对吧?这也是一个典型的一个笔试题啊,改错题吗?问你这个代码有什么问题?我们来运营看一下啊,他其实还是一个断错误程序呢,还是死掉了,你看又死掉了,对吧?为什么呢?简单啊,之前好应该也讲过这个代码啊,类似的 交换两个数字的时候嘛,我们来画图看一下啊,你看 str 占几个字节啊?是不是八个字节啊?好,那我在这边画一下,往边上挪一些吧。啊,看这边不太好画了。 好, str 呢?占了八个字节,那我就把它给画出来,这个叫做 str, 是 八个字节。 那再然后呢? s t r 里面存放的是什么东西啊?是不是一个空啊? now, 对 吧?啊?是一个空,就是 now 啊,就里面没东西嘛,对吧?是一个空指向,但是这八个字节肯定是存在的。那再然后呢?说,我们调一个函数,把这个空给传过去了吧,因为 s t r 就是 空嘛,对吧? 通过函数名找到函数的入口,地址在这边,然后呢?怎么办?传餐,对吧?这个是一个直传递啊,直接把空传给了 s, 所以 s 占八个字节,它里面也是空,对吧? s 占了八个字节,它里面呢也是空,然后这八个字节有一个自己的一个名字,行餐嘛,叫做 s。 再往后呢,我们申请了一百二十八个字节。好,申请一百二十八个字节,比如说这么一块内存吧,啊?很长一块,那这一百二十八个字节,它肯定有一个地址吧,比如说叫零 x 一 百。把零 x 一 百给谁了呀?是不是把零 x 一 百返回给了 s 啊?于是呢, 这个 s 他 就不再是空了啊?应该是多少?应该是零 x 一 百吗?应该是这样子的,那我们说 s 是 一个指征,是不是指向这块内存啊?对吧?当函数调用结束之后,是要释放行餐的空间的。 s 没了, 相当于呢,是这个纸真没了,但这一八十八个字节还在吧,只不过这个 s 没了吗?当我们再次回到慢函数的时候,你看一下啊,把 hello 拷贝到 str 指向的那块内存里面,你看此时 str 是 不是还是空啊,对吧?那于是呢,就是把 hello 拷贝到空地址里面了,所以程序就错了吗?那这个题目问题出在哪呢? 是我们修改的其实是行餐的值,并没有影响到这个时餐 s t r, 对 吧?那这个问题其实跟我们之前交换两个数字不也一样的吗?那这个代码怎么改呢?我们我又要写这么一句话了,之前写过这句话啊,就是如果要修改时餐的值, 必须怎么办?必须传地址,如果要修改十三的值,就必须要传地址,因为我们是想修改 sdr 吗?我们我们想要干的事情是什么呢?让这个 sdr 里面的 now 是 不是改成零 g 版啊?那这样子 sdr 不 就指向这块内存了吗?所以要是如果要修改的话,一定要传地址, 那你看一下我们对职称,因为恰,因为 str 本身是不是就是恰心类型啊?对,恰心再取地址呢?那就变成了恰心心了,可以吧。这个地方呢,我在写了新 s, 我 们先运营看一下结果,待会再来画图, 这两个地方一改,你看再运行,没有,没有断错误了吧,对吧?说明这个程序就是一个合法的程序嘛。那这个为什么呢?好,你看一下, str 占八个字节,那你看 str 有 没有地址啊?肯定有地址吧,比如说啊,这个地址是连三百, 连三百, str 本身这八个字节的地址连三百。然后呢,我在这边传的时候,是不是把 str 的 地址给传过去了呀?不再是空,而是连三百, 对吧?零三百。好,那等到这边的时候, s 是 一个指征的指征,但是 s 占几个字节呢?它还是八个字节啊? s 是 八个字节,但是这八个字节里面应该是什么?应该是零三百吧,因为它保存,因为我们传的,你看这个十三传的就是零三百嘛,所以呢,这个 s 里面啊,它保存的应该是零三百 啊,应该是零三百。那我们可以这么去理解, s 是 一个指征,它是不是指向了 str, 对吧? s 是 一个纸张,它纸上的是 str 啊,有这么一个一个一个一个模型在这吧。那新 s 呢,其实就是 str 嘛,对吧?好,下面申请一百二十八个字节返回。值给谁了呀?是不是给了新 s 啊?新 s 呢,其实就是 str 嘛,其实就相当于是把这个 零 x 一 百给了谁啊?给了 str, 新 s 就是 str 好,然后把 linux 版呢放在这边,于是呢,相当于是 str, 它指 向了这块内存吧,对吧?其实我们是通过 str 的 地址间接的修改了 str 的 值嘛,对吧?间接的修改了 str 的 值,所以 str 是 一个指向这边函数运行结束,同样的要释放空间。 s 没了, 这个 s 没了,就算 s 没了,你看影不影响 str 指向这块内存啊?回到慢函数的时候啊,这个 str 是 多少?现在 str 是 零 x 一 百嘛?那其实就是把 hello 拷贝到零 x 一 百这块内存里面,那其实就是把 hello 放到这块内存里面嘛, 没毛病吧?所以这个代码他是没有问题的,对不对?那这个呢,就是一个指征的指征啊,指征的指征就是二级地址,在 c 语言里面确实是有很重要的一个应用的,尤其是在数据结构里面来回传餐,来回传餐其实用的还是比较多的啊,这个呢,就是关于指征的指征一个讲解。