我们来看一下默认初始化和值初始化,看看他们的区别。我们先来看一个简单的函数啊,假设我们现在有一个简单的函数,里面就一条语句 inter a, 那么 a 的值其实是不确定的,我们可以站在 c 加加设计人员的角度来看这个问题,因为这个函数可能会被调用很多次, 如果每一次都需要我们给定他一个初始值,那么可能是一种浪费,并且很多使用的时候,我们可能直接就通过一个 c in 往里面输入了, 根本就不需要一个初始值,所以呢,他希望把这个权利还是交给使用者。 c 加加就是这样一种,为了一点点性能提升和一点点灵活性,可以啊,放弃很多东西的。这样的一门编程语言,同样是在函数的内部,如 如果我们前面加上 static, 那他就会被放到静态的区域里面,也就是一个全局的区域里面,这个时候他只会被初始化一次, 那么企业家就觉得既然只会被初始化一次,那么我们就给你一个默认值,这就是值初始化 inter 什么作为值数字化最好呢?这个就是拍脑袋想的就是零,对吧?那我就给你一个零,程序运行起来的时候,这个值可能就已经负进去了, 这就叫直初始化。对于内字类型来说就是这样的,对于类类型来说情况就稍微复杂点,下面我们讨论的就是类类型的情况,在 cj 加 primer 里面写了一大堆,那他分了直初始化和默认初始化, 那莫论促使化,它指的什么呢?就是在快作用域内不使用任何促使值,定义一个非静态 变量或者数组,那数组也可以认为是一种变量,对吧?然后如果你使用了默认构造函数,而这个类它本身又有类的类型成员,那么也会进行默认初始化,以及其他的构造函数。 而你没有在初始值列表里面去给出他的显示的初始值,那么也是一个默认的初始化,那看上去很麻烦啊,有点看不懂。其实总结一下这几条讲来讲去,就是对于类类型来说,就是 调用默认构造函数,那谁调用呢?自动调用的是吧?就是自动会调用默认构造函数去创造一个对象。 那我们再看一下值初始化呢?他这里面提到了数足,如果你创造数足的时候,元素的数量,你给的初始值跟他的数量不匹配,那么剩下的这一些没有指定初始值的,他就会给一个值初始化,对吧? 然后呢,这里还有好局部静态变量,也就是前面加上 static, 如果我们写成这样的话, static 好 a 啊 a, 比如说 a r, 那这里面执行的就是 好,就是直初始化,直初始化,上面这个是默认初始化,那这两个到底有什么不同呢?你去看一看啊,对于这个来说,他一开始是没有这块内存的,对吧?这是一个 我们通常理解上的一个初始化,就是申请内存啊,申请内存 到构造一步完成的吧,一起完成。但下面这些呢? 速度的时候,你先申请了这么大的内存,然后里面的每一个元素的内存其实已经确定了,但是里面并没有进行构造,就好像都是毛坯房一样, 这个时候就不同了,所以前面其实是一样的。对于植树石化,我们这里谈的都是克拉斯的情况,就类的情况,对吧?就是 类的情况,所以前面这句话都没有问题,都是调用类的默认勾的函数。但是呢后面的情况就不一样了,那这里面内存 是现成的,就是在现有的内存里构造,其实就是这个不同吧,我这里面要的突出的就是这个子 啊,因为我就是要你把这个值给构造出来,所以呢这个就是值初始化,前面这个是默认初始化,我们看看啊,是不是这样? 对于一个静态的局部成员来说,他实际上是在你程序运行起来的时候,这个内存位置就已经确定了,只是运行到这里的时候才在上面进行构造。 那么这个地方啊,好多人有些争议啊,我们来试一下,总是觉得应该是在这里面才升起内存才构造的,我们来试一下,我们在上面设一个断点,也就是 这个时候其实是没有没有执行到他的,对吧?那我们看看他的地址是不是存在。 然后呢,我们在这里面我们也可以给一个初始值,这个叫做内内初始值就是在类的内部我们是有一个初始值的,当我们执行末轮构造函数的时候,进入函数题之前,我们这个值就会有了,我们写一个 a、 b、 c。 好, 那我们就跑起来试一试啊,我们点击调试,那我们看看进来的时候是怎么样的? 好在这里的时候呢,我们把它放到监视里面看一看,在这里我们看见啊,他的支付串是等于空支付串的,实际上这块内存就已经存在了吧,要不然也不会有 这样的数据,或者呢,我们可以直接去取他的地址,好看,他的地址呢也是一个有效地址,然后我们看看执行的效果,执行到这里好,执行通过的时候,你会发现呢,它里面的值就发生了变化了, 这里变成了 a、 b、 c, 也就是我们希望它的默能勾到函数会调用的一个值。我们还是来看一下当前的这个程序啊, 这是默认构造函数,我们写上啊,不管是哪一种情况,调用的都是他啊,默认构造函数无论是直数字化还是默认初始化,都会调用这个构造函数,那对上 退出的时候会吸购,所以我们的执行顺序应该是先打印函数开始运行,然后呢构造函数 速,然后呢是函数运行结束,再次进入这个函数开始运行,但这个时候就不会去构造他了,因为他在全区区域里面啊,只会构造一次, 直到我们函数在结束,程序退出的时候才会去吸购它。好,我们来看一看啊,执行一下, 首先进入函数,在函数里面构造它,然后退出函数,再运行一次函数,整个程序退出的时候再吸购掉, ok。
粉丝1.0万获赞3.5万


大家好,咱们这节视频呢,给大家简单的说一下,我们这叫声明啊,那么这两个东西呢,其实就是名字上的这么一个区别,然后形式上呢,稍微有点区别,那么实际呢,在应用的过程当中呢, 很多很多的人呢,对这个定义与声明呢,就是变量的定义与声明,这两个名词呢,其实也区分的不那么明显,也不会去区分他,为什么呢?因为这两个东西呢?呃, 在应用的时候呢,大家可以对比一下,上面这个定义呢,会给了一个初始值啊,而我们下面这个声明呢,没有初始值,就相当于呢,我申请了一块空间,哎,这个空间也申请下来了, 但这里边没有给出入值的话,我们知道这个仓库里装的是什么吗?哎,我们就不知道,这种情况下呢,就默认这个仓库呢,我们不知道是什么,当这个仓库 不,我们不知道里面装的是什么的情况下,我们能去使用他吗?那就是说我把这个仓库我不知道什么,我去输出一下,我把这个仓库里的东西我给他输出来,能输出来吗?是不行的,对吧?非法的,可怕的,对吧?因为一旦里边装的什么危险物品呢,你去强行的去拿出来,是不是非常危险呀? 对吧?那编程呢,是自然性质的语言,这种高级语言,所以他跟我们的生活习惯呢,是非常相似的,所以说他学起来呢非常容易啊, 那什么意思啊?比如说定义,我这又定义了个变量 c 啊,那这块的话呢,就不能再定义声明或者定义这变量 a 了,为什么呀? 因为上面已经有这个名字了,你再来一个这个名字,你下面再去使用 a 的时候呢,我们这个系统呢?也不知道你这个 a 是什么东西了,明白吧?你看我在这再用一下 a, 那你说我下面这个 a 究竟是什么?是上面 这个 a, 就是说我输出的这个 a 究竟是这个 a 呀?还是这个 a 呀,对吧?通过名字就区分不了了,所以呢,这会呢会发生什么问题啊?是重定义报错了,对吧?你看这非常简单吗?前面站俩人,站两个小孩,两个小孩都叫小明,你说小明,你说这俩孩子,你说他知道叫谁呢吗?他都不知道, 哎,所以说这个名字呢,我们就不要给他重复了啊,我们这会呢就叫什么叫 c 了啊?哎,叫 c 啊,那叫 c 的话,我们看一下下面这个呢,就定义了一个仓库,仓库里边呢,不知道装的是什么,然后呢我就去输出一下仓库,那么这个行为呢,是挺危险的,对吧?为什么危险呢? 哎,你看这个变音器就知道了,他直接给我们报错了,对吧?哎,他这个报错题是什么呢?他说使用了未初始化的局部变量 c, 你看 c 这个变量呢?没有初始化啊,什么叫做初始化?咱们上节视频说了,哎,我定义一个变量的时候呢,给了初始值,哎,就是给了一个非常明确的值,这个里边装的就是十二, 所以呢这就初始化啊,这就初始化了,那么这个空间呢,我肯定可以去输出它,这是我给的十二, 这是非常明确的,没有任何危险,对吧?那你下面这个 c 的话呢,这里边装的啥呀?对吧?那可能装一条猎犬呢,搞出来这怪吓人的,对吧?哎,这这不知道,所以呢这个这个 cc 元,这个 c 加加呢就给你报错了,你不行啊。 哎,那么我们说这个变量 c 呢,那个小伙说这个变量 c 是不是就不能使用了?哎,那只是说在什么呢?在他的这个空间里边的东西未知的情况下我们是不能使用的,对吧?如果让这个空间里边的我给他, 给了他一个明确的东西,他能用了吧?哎就能用了啊,比如说这个他在初始的状态时候没有,对吧?没有这个, 那我后面呢给了他装了一个数啊,哎,这块呢定义了一个,呃,这个那叫什么来着?那叫那叫未这个未知的这么一块空间,紧接着我给这块空间,我给这个仓库明确给他装个大米可以用了吧?哎那就可以用了啊, 那下边是三十四对不对? ad 就输出了啊。所以说呢,我们这个呃普通变量呢,它的这个声明与定义呢,在我们大众中呢几乎呢是, 呃,没有什么明确的区分的。为什么呢?就是我们这个东西如果没有去给他出纸值的话呢?他不能用啊,那你这个声明完了呢,你紧接着给他付了 一个值,那么这种做法呢,跟我们这个行为呢,他的结果目的是一模一样的,所以说呢,我们一般呢定一变量的时候呢,就直接给了他出示值了,在出示的时候呢就给了他出示值啊,否则的话呢你就要写成下面这种形式啊,我先声明,然后再写一条语句呢去复值, 对吧?哎,其实他俩的功能呢是一模一样的对吧?仅仅是名字上不一样而已,而且下面是两条语句,上面是一条语句,那上面这种呢还更加的简洁写起来,所以说,呃,我们编程经验这一块呢,就是 呃,定义变量的时候呢,就直接给初始值了,我们就很少去使用这种呃,未知的啊,这么一个初始值的这么一个变量,明白吧?啊,所以呢他就会有这么这么一个小小的区别啊,没有什么区别,其实其 是本质上没有区别哎,因为变量呢就是变量,本质就是往里边装数据,那你可以在初始状态装,你可以在生命之后呢单独去装啊。那么单独去装的话呢,你看我们这个 c 啊, 直接就装了,通过这个福利运算符直接往里装就不要再写 in 了啊,因为你这个 c 呢,这个名字已经出来了,已经申请好了,那么你之后呢用 c 的时候直接用就行了,听见吧,不要再写这个 in c 了啊, in the c, 那其他的这个 w 了什么都一样的啊啊,这是声明 没有数值不能用啊。报错,紧接着是我们这个类型的选择,那类型的选择呢就取决于我们这个数据的大小啊,而我们大的空间呢,去装这个小的数呢是没有问题的啊,这个数不是小数,是小的啊,小的数就是说我这个四字节的空间他装的这个数呢, 他最小呢,可以是负的二十一亿多到正的二十一亿多,那么这个里边的数呢,都能够在这空运装,那如果说你这块来一个四十亿的数往这去装,能装的下吗?哎,就装不下了啊,咱给大家演示一下, 比如说我这个 c 呢是呃是哨特类型的吧啊,咱们这块呢就不演示差了啊,差的话呢,我们后面是作为字符去演示啊,这块呢就是搞整形哨特啊, 哨子的话呢,他的这个呃有符号的呢,负的三二七六八到正的三二七六七啊,那我这块给个大点的,我给个六万六千六百六十六,六十六万多,那就这么大这个数是不是超过这个 c 这个两字节的空间范围了 啊,那么这个时候呢,我们再去输出这个 c 的时候啊,哎,你看变音器呢就会给我们提示了,他说从 int 呢到 sot 截断了,什么意思呢?哎,我这个数呢是六十六万多, 那么他呢默认就是什么?就是印他那个范围里的数了啊,他已经超过这个 short 这个范围的了,所以系统呢默认了就是他是印的范围的这个数啊,那么你看印他到 short 阶段啊,因为就是什么叫做阶段呢?我印他大的,大的装在你这个小的里边,那怎么着阶段 对吧?你看很好理解吗?啊那就不截断,怎么着也就是相当于舍掉一块,你看最后我们这个装的结果是什么?是一万 一千三百零六,对吧?那么至于说这个数是怎么来的,我们根本完全不用去管,为什么我们明显的知道这个大的数装在小的空间里边,这就是不合理的,不合法的,对吧?他必然会出错 啊,他都不是偶然啊,是一定会出错啊,你看这个啊,出来这么一个问题是不是?所以呢我们要注意你这个 数呢要用相应的啊,那个范围的那个那个那个那个什么就可以了啊,那个那个那个类型啊, 明白了吧?反正这个完全就不设计,那我们这个小的数装大空啊,小的空间装大的数不行。那大的空间装小的数肯定是没问题的啊,那你像我这个少特数少特这个呢?我装十二有问题吗?没有问题,我用 inter 装十二呢,有问题吗?也没有问题, 对不对啊?那这个能装的开就行啊,那我们平时用什么呢?我们平时用这个 inter 是最多的 啊,因为这个或者说不管什么情况下我们都会去使用这个 int, 除非呢这个数的范围超过 int 了,我们使用浪浪或者使用浪啊,但是呢,在这个 int 范围就是说呃,少特 int 和这个差都能用的情况下呢,我们一般用 in 啊,这为什么呢?因为就是我们后面会讲影视类型转换啊,就是少特和差类型呢,他在参与运算的时候呢,这两种类型呢,会默认的抬升,默认的给他抬升成 int 参与运算。 所以说,呃,你用 shot 和叉的话呢,实际跟用 int 呢,是本质上是一样的啊,哈哈,本质是一样的,但是说我们就这样啊,但是说你这个用 shot 的时候呢,申请空间呢,会是小一些是不是? 但是参与运算计算机呢,会进行这个转换,而这个呢,我们就,呃暂时不用多研究他啊,我们未来的话呢,会慢慢的更理解他这种行为的啊。


欢迎回到现代 c 加加编程入门,本期节目是声明并出示化字符串对象,然后输出。那么首先打开代码编辑器,新建一个原文件,命名为字符串对象的声明及出示化点 cpp, 我先写上了基本的程序框架,然后呢我们来写主要内容, 那么自拍对象呢?它是定义在 string 这个图文件里面,所以我们需要将它先引入进来。那么声明自拍对象呢?我们先写上它的类型,那就是 s t d mom out string, 然后它位于 s t d 这个名称空间里面空格,然后呢是编列名称,那么这个呢,我们叫做 h w, 然后呢是一个初始画室, 说实话是里面呢,我们想这个字母串的字面量也是对双引号引起来的一个字母串,这叫 hello, 最好 word, 那这样的话, h w 这个字母串对象呢?我报的字母串就是 hello world, 那么字母串的初始化呢?并不只有的一种方式,我们再看几种 st d 妈妈 stream, 那这个呢,我们叫 hello, 然后呢是初始画室,那初始画室里面首先用双引号写上一个 super 字面料, hello 更好, vlog 就好。那么后面呢,再写一个数字,比如说是因为我们从这个字面量里面要把 hello 这个单词呢 get 出来,这个呢我们叫做部分初始化, 因为这字符串呢,单词号楼有一二三四五个,那么这个意思呢,就是从中音号零开始,然后呢取五个字符作为号楼的初始值, 然后呢再看一个 s, t, d 毛毛 stream, 那这个呢,我们将中间这个逗号呢给它提取出来, come on, 那这次呢,我们使用界面申明好的 h w 这个字符号对象 h w 都好,那这个呢我们后面还可以写两个数字,第一个数字呢就是开始摘取的缩影号,我们数一下一二三 四五,那么所以号呢是零开始的,我们再说一遍,零一二三四五,也就说这逗号呢它,所以号是五,那么它只有一个长度,所以呢我们就摘取一个,那这样的话这个逗号呢就会复制给 come on 这个字谱对象,然后呢再看一个 s t p 猫猫 stream, 这次呢我们将 world 呢再摘出来,同样在前面声明好的支付对象 h w 上进行,那么 world 呢?我们数下它在它的所用号是几 零一二三四五六,再说他的损耗呢是六,同样呢我们可以再往后摘取他一二三四五五个字符,我们可以后面呢提上五,也说从第六个损耗开开始,往后呢摘去五个,因为呢这个字符最后呢就这么多,所以呢我们可以从这个 地址呢取到末尾这个五呢我们就给省略,这样的话 world 的单词呢就会布置给 super 对象 world。 另外呢我们再看一个 s c, d 帽帽 street, 那这次我们选一个 z z z z, 然后呢是个圆括号,圆括号里面呢分两部分,第一个呢是 字符的个数,比如说是三都好,然后第二个呢是字符用单音号引起来,也就说它可以呢用三个字符 z 拼成一个字符串,然后呢将它复制给字符对象 z z。 那么接下来呢,我们输出 sd, 那么代码呢,我们就写完了,按 ctrl 加 s 保存一下,然后来到控制台, 我们通过这个命呢对原文件进行编辑,回车没有任何输出表现并成功。我们通过文件尾呢来调用这个程序查看结果,字符串对向的上面提出画点 exc 回车。

哈喽,大家好,这里是 it 技术百货,专注于有价值的 it 技术知识分享。嗯,今天我们继续来分享 c 家家的一切入门的知识。我们分享的今天的分享是讲一下 c 家家变量的定义和初始化。 嗯,两个大的问题啊。第一个大的问题是说,先解释一下变量的声明和定义的区别。嗯,变量声明呢,它是告诉变异器我这个变量的名称和类型, 但他并不分配内存。而变量的定义会分配内存,并且为变量复出市值。这也就说声明和定义的这样的一个区别吧。声明仅仅是针对变音器,告诉他这里有这样一个变量, 而定义的话,就会分配内存,并且付出是值。我们可以看一下。然后通常来讲,其实定义和声明他是同时发生的。但是也有一些特别的例子。我们先看,像我们通常这样定义一个变量,他是嗯,记忆,他是那个声明, 声明和定义同时发生的,就这是定义的一个变量,他在这里也会为这个变量分配内存空间,然后复出值。嗯,然而呢,像这样,他其实引入了一个外部的一个变量,在这里呢,他就是仅仅是声明,而不涉及到定义。 而第三行这块,他引入了外部边量,并且他为这个边量负了值,那么这就是定义。 据说其实区分声明和定义很简单的一个点,就是说看他有没有分配内存和为变量复出是值。如果说他为这个变量复值了,那就是定义。如果说他仅仅是声明了一个变量,那就是 就是没有涉及到分配内存,那就是一个声明。好,嗯。第一个问题我们讲到这里,然后第二个讲一下那个变量的直接初始化和拷贝初始化的一个区别。 嗯,首先我们看一下什么叫直接出石化和什么叫拷贝出石化。那个直接出石化的话,他其实是调用构造函数来进行出石化, 也就是说会有一个对象的构造函数,我通过调用这个构造函数,然后这个函数的反馈值就是这样一个对象,然后呢进行 出示化,这是直接出示化。而拷贝出示化呢,他的逻辑是分为两部分,第一部分是先调用构造函数生成一个临时对象,然后呢去调用临时对象的拷贝构造函数,然后呢通过拷贝构造函数来返回这样一个对象。 好,我们来看一个例子。 嗯,这是自己定义的一个类,我们这个类名叫 a。 然后呢,我们看一下,然后第十一行这种方式呢,其实是 这种方式是嗯,第十一行他这个是直接除石化,也就是说他其实是会 调用这个构造函数,也就是吃掉第四行的这个构造函数,然后呢直接生成这样一个变量,并且做了初始化。然后第十二行他是拷贝初始化,拷贝初始化,他呢会先利用这个一这个数字,然后调用 这个构造函数,生成一个临时对象,然后呢再去调这个临时对象的这个拷贝构造函数,去 得到这样的一个对象 a, 然后复制给 a 二,然后呢,第十三行这样的一个写法,他呢是 直接调用这个对象的拷贝勾到函数,或者说我们也可以称为复制一份,然后呢给到 a 三。好,这是 这是这个直接图实话和拷贝图实话。也就是说,直接图实话是直接调用构造函数进行图实话,而拷贝图实话是通过调用一个对象的拷贝构造函数,拷贝函数去进行一个图实话。 嗯。然后呢,这是这个在语法上的区别,就是说我直接出石化的话,就相当于掉沟的函数一个样子。 然后,嗯,其实这里面还有一个小细节的点,就是这里面是用的小括号,其实也可以换成中括号,如果错了也可以换成大括号。就像下面这种方式。但是这里面是有一些细节上的区别的。嗯,小括号的话,其实你可以看就像这种 写法。第十八行这种写法,他其实很像一个函数声明,对吧?所以说,其实跟函数声明容易混淆。所以说,其实 c 佳家为了有一个统一的标准,他就 这个定义的这个用大括号来进行这个直接出石化的这样一个标准。 当然这个小括号也是依然可以去用的。但是大括号也会有些问题啊。大括号的问题主要就在于说,如果说我的构造函数有 这个类型的入餐的话,他往往就不能够正确的去找到该调用哪个构作函数了。因为我们前面也提到了直接初始化的逻辑,他本质上就是在调用构作函数。然后呢,无论是小括号还是大括号,他都是直接初始化。但是呢,大括号在这种情况下,他是不能 够准确的去找这个调哪个构造函数的。于是如果遇见这种入餐的话,我们可以简单看一下这个例子。 嗯,比方说在这里面他是声明了一个类,然后里面有三个构造函数, 那我们前面都跳过,然后嗯,直接看这个。这个构造函数,他第一个参数是十,第二个是一个布尔类型的。正常来讲,他应该调第一个构造函数,就是这个是那个一个印特和一个布尔类型的。如果说我们用小括号的话没有问题,他会调第一个构造函数,但是如果用大括号, 他就会高,就会掉这个第三个构图函数,而且他会默认的去把这个类型多一个转换,这就是他的这个问题。所以说通常呢,我们还是习惯去用小符号这样 来去做这个调。用。好那个,今天的分享就到这里简单总结一下。讲了两个问题。第一个问题就是 嗯变量的声明和定义的区别。声明就是仅仅告诉他什么类型有这个变量,而定义的话是分配内存付出值,然后在黑加加里面,其实声明和定义通常都是同时发生。 然后呢?第二点就是讲边量出石化。然后呢,常用的两种出石化的方式。第一种是直接出石化,他的写法是调用构造函数,这也是他的底层逻辑, 就是调用工作函数来进行直接除石化。第二种除石化方式,就是调用拷贝函数来直接进行除石化。当然了啊,刚才有个细节的点忘讲了,就是他在调用这个拷贝 函数出示化的时候,他如果说遇见拷贝函数是私有类型,或者说必须显示调应的时候,也就是说必须如果一个拷贝构造函数 被这两个变量修饰的时候,那么这个拷贝出石化就是会变一包错,你们可以看一下。也就是说如果说我把这个两个任何一个,如果如果说我把第二个改成 prawet, 或者说是用这样一个关键字来修饰, 这样的话就是他就会要求要在看,在这就报错了。他就是说没有找到适当的那个构造函数,也就是说你必须得显示的去调用才行,这样的话就 不能够掉用了。如果这样写应该就可以。 好。然后请今天的内容就分享到这里,感谢大家观看,喜欢,喜欢的话可以点赞关注。

大家好,咱们这节视频呢,给大家介绍一下指针变量的定义哈,也就是初始化,那么哎,初始化的形式呢,就是如下的,首先呢,我要定一个变量,对吧?这个变量呢是个硬特类型的变量,所以呢,我们要用硬特类型的指针呢去指向它,为什么呀? 哎,也没有为什么,这就是我是这个类型的你,你要指向我,那你肯定要跟我一样的,对吧?哎呀,都是类印子类型的啊,否则呢,那不一样的话,那肯定是不行事的,是吧,所以这个基本的道理很简单啊,他说印子类型的变量的地址呢,就用印子类型的指针来装呀,然后将这个地址呢复制给我这个指针变量批 啊, pa 啊,这是这个,然后下面呢还有 flow 类型的变量 b, 那我就要用 flow 类型的指针呢去装着这个变量 b 的地址,哎,这个呢是它的一个基本的啊,基本的这么一个原则啊,也很简单。然后呢,我们看一下,这个不用先不看啊, 我们先先写一下,哎,我们写,写到这个变音器上之后啊,我们心里呢就就有一点点的这个印象,可能更深刻一点啊,你要一点不写的话呢,可能有点不太深刻, 装着 a 的地址,对吧?啊,好,然后呢,我们看一下他的注意点啊,首先呢第一点,各种类型啊,变量的地址呢,类型都是不通的啊。 ab 变量的地址类型呢,就是呃,变量 对应的类型,哎,他地址类型的,那就是对应的类型了,就像你这个呃变量,哎,他是印子类型的,那他的地址呢?哎,也是印子类型的,为啥呀?因为这个地址呢就是我们这块空间的第二种访问形式,对吧?比如说零 x 一零, 我们这个变量 a 呢,也是访问这块空间,零 s 一零也是访问空间,哎,你这你这个 a 是印的类型的,我这零 s 一零呢,也是印的类型的, 对吧?哎,你看这就对应上了吗?啊,这是这个,嗯,所以装地址的指针呢,也要是变量的类型,他俩呢必须是一对应的,你是印他,我是印他,只不过我多了一个星,为啥?因为我装的是你的地址,所以说我要多个星啊,如果没有星的话呢,我装的就是 a 啊,用 pa 装 a, 但是我有星的话呢,就装你的地址啊,这是这个啊,然后紧接着啊,指针的复直操作呢,又叫做指向啊,就是我们在啊指针这块呢,又多了一个名词,叫做指向,比如说呢, p a 啊, p a, p b 吧,这是 p b 啊, p b 装着我复制上我们 b 的边量地址,我们就说 p b 呢,去指向了 b, 对吧?指向,呃,演这个,这个完整的说就是 p b, 这个边量呢,指向了 b 的空间,对吧? b 的空间。那么本质是啥呀?本质就是 p b 装着我 b 空间的地址, 所以说他这块呢,多了这么一名是叫做指向,听起来很高大上,其实呢还就是个复制运算服嘛,对吧?名字而已啊,名字而已。然后第三点要指向合法的地址空间, 哎,什么叫做合法的地址空间呢?我生我定义了这么一个变量币,那么系统呢,就为我这个变量币呢申请了一块空间,那么他给咱们申请,我们就能去使用了,那这块空间对我们来说呢,就是合法的, 对吧?所以呢我这个 pb 呢是指向他,并且呢能够去使用啊,当然这个指针的使用,我们后面就给大家讲啊,哎,就能去使用了,如果说,哎,我就随便去给他一个地址值,那能行吗?不能行,为啥?因为这是非法的空间,非法的空间我们不能去用,用的话呢,程序就异常中断了, 明白这个意思吧?比如说啊,咱们这块啊,我这块呢是正常给这个边量 a, 对吧?这样任 和操作没有问题啊。然后比如说我这块又随便给了一个啊,就假装我这个是地址值,对吧?我给了这个 pa 了,那怎么着啊?哎,那他就有问题了啊,咱看一下,首先呢他这块呢有一个警告哈,这个警告呢,我们先,呃,先忽略他就行啊,先忽略他啊,然后呢我们去 假装呢就使用一下这个 pa, 但是这个使用没使,没,没什么呢,没讲啊,咱们呢这块呢就是给大家演示一下他指向一块不合法的空间会有什么效果啊?来看一下, 哎,怎么着?直接就,哎,这个能不能变小一点,哎,变小了啊,就是这块直接就警告就出现异常中断了,对吧?哎,这种异常中断是非常严重的异常中断哈,这种情况呢,就像是我们玩游戏的时候, 玩着玩着一阵,然后呢游戏画面灰了,对吧?然后提提示一个程序终止运行,点击试,还是否我们一点试,然后呢?哎,游戏呢就挂断了,对吧?就没有了,自动跳出了啊,然后的话呢?哎,有时候玩着玩着中途卡游戏直接卡掉了,对吧?还有的时候玩的游戏呢,蓝屏了, 哎,这都是什么?这都是内存异常引起的,哎,那么我们这块呢就是这种问题之一,你看他说写入访啊,写入访问权限呢,发生了冲突,你看这个黄色箭头指向的这一行吗?然后这个红叉呢也指向这一行,就是这 什么叫做写入权限访问冲突啊?就是我们呢要通过这个指针呢,或者通过这个地址的值啊,向他对应的空间呢,去写入数据,对吧?呃,向上这个空间写入数据,但是这块空间呢不是我们的,不是我们的,我们就没有权限去写, 所以呢,你在写的时候呢就发生了访问冲突,人家不让你写,你非得写,是不是就冲突了?哎,这个冲突的结果是什么?是我们落败了啊,因为电脑呢,他,他那个是所有的规定都是死的,你不按照他的来,那你就只能落败啊,你是改变不了电脑的,除非你把他锤烂了,对吧?哎,这就是 吸收方位全也发生冲突了,对吧?那如果说是,你看我如果让我这个指向的是我们的 a 这块空间呀,哎,那我们这个效果是怎么着的? 是一点问题都没有的啊,你看一点问题都没有,并且呢我这个 a 的值呢还被改成了四十五, 对吧?哎,所以呢,这就是要让我们这个指针呢指向合法的空间,我们才能去使用,哎,只要是我们申请的这个空间了,他就是合法的,明白吧?啊?不合法的呢,我们不能去用啊,这是 这个,然后紧接着我们继续看课件啊,紧接就是他的这个内存模型了哈,内存模型的话呢,我们是举例子,拿上面这个 a 去举例子的哈,就是说我们啊,看一下这样两个边量,他的呃,内存空间是一个怎么样的关系啊?那首先呢,我这个 a a 的话呢,就是一块 空间了,对吧?一个四字结的空间,哎。然后呢,假设他的地址是零 x 一零,哎,这空间里边装的是我们的十二这个值,对吧?然后紧接着定义了我这个 p a 这个变量, p a 呢也是一个变量,虽然说它是指的面料,不管是任何变量它都有自己的空间, 对吧?哎,因为我我定义这个变量就是装数据的,你装数据你就得有空间,你没空间,你这能装数据吗?装不进来,对吧?哎,所以呢,我这个 pe 这个变量,你不管是啥变量,他都会有自己这块空间,对吧?当然这个空间具体是多少自己,那我们在这块去讲啊,我们只 现在呢,只需要知道 p 这个指针变量的也有自己的一块空间,它里装的是什么呀?装的是 a 的地址,对吧?哎, a 的地址是零 s 一零,所以说这块空间里边装的是零 s 一零,那我这块空间的地址呢,也是零 x 二零啊,哎,就是另外一块空间了, 哎,这就是他的一个内存上的一个关系啊。很多小伙子呢,就学指针这块呢,也不知道是怎么回事啊,可能是没人告诉他,就认为指针没有空间,指针变量没有空间,哎呦,指针我就指向那块空间呢,我指针没有空间,你这个没有空间,你这个变量是干啥的呀,对吧?一切变量都有空间呀, 电量就是装数据的,你没空捐,你装什么数据啊,对吧?哎,他呢就是把这个指向这个东西就简单理解成一个箭头了。哎,你不要这么去理解啊,指,指向是啥意思呀?指向并不是说这个 pa 就指向你啊,而是什么呀? pa, 复职,哎,复职运算服最本质最本意是这个 复制运算服,他把这个复制运算服起了个名字在指针,这叫做指向。哎,他不叫复制了,叫指向,但是他本质上就是这复制运算服。复制运算服干啥呀?将我们数据装在这个变量里头,我指向你就是把你的数据这个地址啊装在我这个变量里头,所以说我呢是一定有空间的, 对吧?哎,他说我们从学习这个根上这块呢就不要出现偏差啊,出现偏差的话呢就哈就出问题了。好,这个呢就是我们指针变量的定义啊,也就是这块的一些基本的注意点啊。

欢迎大家来到阿联老师的 c 加加课堂,今天我们来学习 c 加加的数据类型之间的转换。我们先回忆下我们之前学过的数据类型, 在谢佳佳中,基本数据类型包含整形浮点型,字符型,布尔型。整形呢,又分为 shout, 短整型,我们用面量 a 来表示,给他负一个值。好,基本整形 int b 同样给它负一个值,然后长整形 long long c 也给它负一个值。浮典型呢,我们讲了三种,那常用的呢?是 float, 我们让 等于一点一代表小数 double e 等于也是一点一,然后 double 我们这里用的比较少,就先不解了啊。字符型, chair 字符,我们用引号引起来单引号,然后我们还学了 boar 形 g 等于 boar 值呢,有处和 boss, 我们可以用整数一和零来表示,那我们这里是一把一代表。真 好,我们把 c 加加的常用的基本数据类型写在了这里做了定义。下边我们来讲一下如何来判断我这个变量是什么类型的数据呢? c 加加中 提供了 tip id 关键字,用于获取类型信息,它的返回值呢,是存储类型信息的一个类对象。 tip 音放, 我们通常用 tap id 这个关键字比较两个变量是否是同一类型,比如我们可以这样来写, see out 输出一下 tap id 啊,变量 a, 哎,我们要看 a 这个类型和 type id b, 电量 b, 他们两个是不是同一种类型,那么我可以通过他快递这样做比较,然后我们可以输出看一下结果。零零,我们上节课讲说他代表的这是什么呢?就是 word false 啊。那我们怎么去获取这个变量的类型名字呢?我们可以这样去做, pep id a 变量 a, 它是哪种类型呢?我们可以写个点,还有个方法,这个对象的有一个 name 方法就可以获取到我们 a 这个变量它所属的类型的名字,我们可以看一下它的返回值, 哎,返回一个 s, a, 我们看在定义的时候呢,它是 short, 是代表的是 short 这个数据类型,我们可以依次看一下每种数据类型分别用哪个字母来表示。好老师这里把每一个变量呢,它的 类型返回值呢?都做一个输出,我们来依次看, s 是 short, i, int 基本整形 x 是 long, long f 代表 float, d, w, c, chair 壁纸布,除了浪浪用的是 x, 其他都是用了我们类型定义的这个关键字的首字母,所以还是比较好识别的。 下边我们就来看一下不同数据类型之间他们的转换。我们先看隐私转换,什么是隐私转换呢? 我们如果不同的类型的数据在进行运算时呢? c 加加会首先将两种类型转换成统一的类型,然后再运算,那这种转换 就是演示转换指示佳佳在运行时内部的转换。我们通过输出来看一下每种类型之间是如何转换的。 我们先看 shot 和 int, shot 变量 a 和 int 变量 b, 我们让做一个加法运转,输出一下 a 加 b, 然后我再输出 tap id a 加 b, 哎,我说出他们相加以后是什么类型,我们把它的类型名字返回一下, 好并异形我们看一下,在这里就说一个二 i, 那二呢,指的是 a 加 b 的值,那么 i 呢?指的是我们 相加以后呢?它是返回的是 i, 让我们看 i 是 in, 也就是说计算机会先把完整型变量 a 转换成整形, 然后呢再进行计算,最后呢结果也是一个整形好,这是短整形,会隐示转换为整形。下边我们来看 int 和啷啷,那这里就是变量 b 和变量 cb 加 c。 好,我们运行一下。好,我们看输出的结果是二 x, 那 b 的值是一, c 的值也是一,然后 x 代表的就是我输出的类型,我们可以看 x 呢是 long long 长正形,那就是什么意思呢?就是我们的整形变量 b 首先转换成 朗朗长正形,然后呢再与 c 进行计算,最后的结果呢还是朗朗类型好。那么刚才咱们说了, shelter 短正行会自动转换成 int 整形,然后整形变量呢,它会自动转换成什么呢?啷啷,那么如果 sout 和啷啷呢? 哎,我们肯定是要将 shout 短整型转换成什么呢?啷啷长整形啊,那我们再看啷啷和 float 这两个类型,他们之间会是怎样的?饮食转换好,啷啷是 see vlog d, 那我们看一下 c 加 d。 好,我们编译运行一下。好的,我们看一下结果,结果是二点一 f, 那么二点一呢,就是 c 加 b 的值,一加一点一,最后的返回值呢是 f float float, 那么它就是将我们长整形 啊,先转换成浮电型,然后呢再进行计算,最后的结果呢还是浮电型好。那同样的,我们把下边一起来看一下单净度浮电型和双净度浮电型他们之间是如何来转换的。 d 加一。 好,我们看二点二,一点一,加一点一,二点二,然后最后返回的是 d, 也就是返回指是 d, 也就是是 double, 是双精度福建型。 好的,那接下来我们来看 chair, 我们看前边都是数字数值,而下边这两个呢, chair 似的,是字符, 不是一个逻辑值,那么他们之间是如何进行转换呢?咱们来看一下,我们来看一下短整形和字符形他们之间是如何来进行转换的? a 和 f, a 加 f 的值,然后我们再看一下它是什么类型,哎,结果出来了,我们可以看五十 爱,哎,看看跟你想的一样吗?爱是什么呢?是 it, 为什么会是爱呢?好,咱们来一起看一下。 我们说字符型呢,他在参加预算的时候呢,计算机内部会使用他的阿斯科马,咱们可以看一下前边老师讲的视频,在讲字符显示出去的时候呢,哎,字符都是通过阿斯科马的方式来进行存储的,那么阿斯科马呢,他会认为是掌型, 所以呢字符形呢?其实我们如果在运送的时候呢,可以把它认为是一个整形数据,那么整形和短正形的话,他返回的口音就是什么呢?是整形。那这里值为什么是五十呢?我们来看 f 的值是字符一, 那么零的阿萨克马,我们之前有说是四十八零,后边呢这个一他就是四十九,所以 f, 他的阿萨马这是四十九,四十九,再加上 一,所以就是五十。那么这里咱们知道字符形呢,可以当做是整形来对待的话,如果字符形数据和朗朗来进行计算的话,它的结果应该是什么呢? 是什么类型的?因为我们整形和浪浪,他的结果是浪浪,那么制服型和浪浪呢,结果肯定也是 同样的,如果说字符型和 log 的话,它的结果肯定就是 log。 我们来看布尔雷形,布尔雷形其实就更简单了,它只有两个值处和 boss, 那么它在存储的时候呢,就是一和零,一就代表处,零就代表 boss, 所以布尔值在运算的时候呢,同时会转换成 int 整形。那么我们布尔类型和 short 类型的数据,在运算的时候,它的结果会是什么类型呢?哎,对了,它会是 int 整形,我们可以来看一下 n 加 g, 我们编语运行一下,我们看结果是二,因为呢负尔值呢是一,我们在这里是一,加上完整形的一,结果是二,然后 它的返回值的类型呢是 i 是 h, 那布尔类型和 double 它的返回值会是多少呢?相信你们一定能答对,是不是啊,肯定就是 double, 我们可以看一下 e 和 g, 好,结果就是二点一 dw。 那么如果说字符型和布尔型这两个数据,如果进行运算的话,它的结果返回的会是什么类型呢?咱们可以想一下, 这弧形呢,他在运算的时候会隐私转化成 in 整形,沃尔型呢,他也是转化成 in 整形,所以他们两个如果做运算的话,那结果肯定也是什么呢?哎,整形呢,咱们来看一下,是不是啊? fg f 加七,我们编译运行看一下,哎,结果就是五十 i i eight。 通过刚才我们的书结果,我们可以得到一个结论,什么呢?就是 数据类型之间的演示转换,他是从小类型到大类型自动完成转换。好,那如果有这样一个练习题,咱们来看一下, 我们呢输出六除以四的值,那么咱们看一下六和四都是什么呢?都是整数,而他的返回值的结果呢?我们可以看他也是一个 整数,是一,那如果我想让他输出一个小数怎么办呢?哎,前面我们说我们的 整形数据会自动演示转化成啊浮点型数据,那我是不是可以把这里这个六或者四,把其中一个写成小数呢?写成浮点型数据,比如说六是不是就六点零呢? 那么六点零他就是一个浮电型数据了,那浮电型数据和整形数据进行除法预算的时候,他的结果会是什么呢?哎,会是浮电型数据,那我们看一下结果,哎,就是一点五是不是得到了我们的正确的结果? 在家除了隐私转换外,他还提供了强制类型转换。那么如何做强制类型转换呢?我们来一起看一下。强制类型转换呢?有以下这样几种方法。第一种方法就是先要写 像我们类型的关键字,比方说如果是想强制转化成整形,就写 int, 如果强制转化成浮典型呢,就写 note 后边小包里边呢是一个表达式,是我们要转换的这些数据,它可以是一个变量,也可以是一个式子。 来举个例子,比方说我们看这里定义我们 b, 它是一个 eight 整形,那我可以通过啊 float 把它强制转换成浮点类型,那怎么转换呢?我们可以这样写, blot 小括号 b 关键字,然后括弧里边呢是我们要转换的数据。好,我们输出一下它的类型,看一下它是不是转换了,把它呢放到我们这个输出的类型里。 好,我们看转化的结果,我们看说出一个 f 就是 vlog 类型,也就是现在呢这个 vlog b, 它的值呢是一个浮点形式金,也就是说将 b 转化成了一个 浮点形形句,这是第一种转换的方法,关键字括号。然后第二种方法呢,我们可以把关键字用小括号括起来,然后后边是表达式。那我们再写一个,比如说我们想转化成 w 类型,可以这样写小括号 do, 然后后边呢写上我们要转换的式子,比方说我想将 see, 浪浪这个变量转换成 do 类型,然后后边可以写成 see, 把它呢放到这里边来,输出一下,最后转放的结果, 输出 d w, 这是第二种强制类型转换。然后第三种呢,我们可以在关键字和表达式上都加上小括号,这种写法也是可以的, 就是这样,关键字加小括号,后边的表达式也加小括号,变异运行,那也进行了转化。 好,刚才讲的这三种方法呢,其实都是一个意思,只不过斜把上不同。那我们看第四个方法,第四个呢,可以用 指定类型的变量负值,什么意思呢?比如说我这里定一个整形电量 b, 然后我可以这样给他负值, b 等于四点五,那实际上 b 的值会输出的时候是多少呢?咱们来一起看一下。 哎,我们看他输出了一个四,为什么呢?因为 b 他是一个整形变量,所以我们在给他复制的时候呢,他会将后边这个数值强制转换成整形数据,然后复制给我们的整形变量 b。 好,我们来做一下这些练习,看一下你能不能完成。第一个 set, 十一除以五,那十一是一个整数,五也是整数,那么它的结果会是多少?嗯,返回值也会是个整数,所以是二。 好,我们来看下一个 set double, 十一除以 double 五,在这里它进行了强制转换,将整数十一转换成双精度浮点型,五也转换成了双精度 浮点型,那么他相处以后,结果是 w 类型,所以是二点二。我们看这个,这个的写法跟上面不一样,但是意思是一样的,只是把关键字用括号括了起来,那他的结果应该也是一样的,是二点二。我们再看下边这一个, 这个呢,我们将十一转化成了 double 类型,五还是整数。那么这个在做计算的时候呢,他其实会有一个隐私转换,因为十一是 double, 那这个整数五呢?在计算的时候,先转换成了一个 double, 然后最后的结果 还会是 double, 所以他也是二点二。那我们来看最后这一个,有没有人会告诉我这个的值会是多少呢?他同样转换成了 double, 但是呢,他的括弧里边呢,这个表达式是两个整数进行相除, 那他会这样计算,他会先计算十一除以五的结果,然后把这个值呢再转换成 double 进行输出。那十一是整数,五也是整数,十一除以五呢,他的结果就是二,二转换成 double 也还是什么样? 还是二,对不对啊?来,我们来看一下结果。好,我们看是不是跟你想的一样呢? 好,我们的强制类型转换呢,就讲到这里,那不管是隐私类型转换,还是强制类型转换,我们都要遵循由小到大的原则, 这样呢才能确保数据的安全。如果大数据的类型转化成小数据类型,会发生什么呢?我们可以做一 练习来看一下。在这里呢,老师定义了一个整形变量 i, 然后呢我们又定义了一个长整形变量 g, 然后他有一个很大的一个数值,然后呢,我们通过负值的方式将这个值呢强制转换成整形,然后负值给爱 我们看,结果是错误的,跟之前这个值并不相等了。就是说我们大数据类型转换成小数据类型的时候,就很容易发生溢出,这样呢我们的数据就会出现错误。 所以老师说我们不管如何进行转换,都要遵循从小到大的原则来确保数据的安全。 好的,今天的关于 c 加加的类型转换,我们就讲到这里,拜拜。

初始化和副职的区别?对于简单的类型来说,初始化和副职没什么区别。对于类和复杂数据类型来说,这俩子的区别就大了。最后,记得点赞关注!


滴滴滴啦,老司机赶紧上车,只要技术好,买不买票没关系,几个录像机警报啊,一般是不建议关闭, 因为这个录像机硬盘一旦出现问题,我们可以及时知道。点击左下角的感叹号,可以详细查看录像机报纸信息 到达硬盘出现异常情况下,我们可以细细出席外面观,不过啊,基本没卵用,根据恶搞我创业多年经验分析, 用不了几天钥匙滴滴叫这个倒好,直接连面子也不给了,烦死了啊。关闭报警,进入主菜单,打开系统设置,点击异常配置。萝卜青菜各 有所爱,可以根据自己的喜好量身打造哇,灵机一动,在我的威逼利诱下。不不不,是好心情说下啊。 屋主终于改口说他有钱直接换这玩意修我不会,但是换起来我可就厉害了。先把外壳的螺丝全包下来,拆的时候切下去,手不要抖,搞起啊,把龟剁成狗。 这个落相机记得要关机,话是拔掉电源也可以,不然等一下爆炸了我可管不了。松螺丝下硬盘, 简单清理一下。由于没有吹风机,只能靠嘴啊。拍视频吗?门面还是要抵,不然怎么体现出专业。好了,现在装 螺丝对应好好上行,如果太冷的话,其实不上也没关系的。恰有喜乐、开心加动摇。 这两个接头啊,一的都插回去,伤性为数据,细性为定型性。家用录像机推荐指旁 单位或企业局推荐立盘,重新装上外壳硬盘出席话弹窗提醒,新盘必须一定要出席哇,记得查看状态是否正常。一个硬盘啊,保三年,能换就别修, 又不是没有那经济实力,这是刚刚升的模拟摄像头啊,效果百里故。哦,这是迎新老的这几个城市老板定做的,很高清了,甚至不输康康的两百万摄像头了,你们觉得呢?

大家好,我是小林。今天这节课要讲一下 c 员字符数组的初始化。 c 元字符数组初始化,说白了就是将各个字符依次复制给数组中的个元数。看一下小的写好。这个 demo 第五行等号的左侧是定一个叫 l 的字符数组,它的大小是三,右侧就是进行复职。在 c 元中,字符是需要用单引号括起来的,这 这是和前面的一位数组和二位数组的不同之处。处置化有一点需要强调一下,如果在定义自负数组时没有进行处置化,那么数组中的元素是不可预料的。看到这的小伙伴可以给小丽点个赞,好下课!