00:00
同学们,我们来看第31题,第31题呢,它是一个。代码题。先阅读一下代码。这段代码呢,看起来是稍微复杂一点哈,大家看一下他说程序运行的结果是什么。那么我们就从这个主函数开始读啊,开始阅读in a是一个整形变量,然后呢,放十大家看,它在这里调用了。一个函数叫放,然后传入一个十,并且把这个结果返回给这个A,因此呢,我们现在要来做一个分析。做怎样一个分析呢?就是我们这句话,发生了什么事情。放十,那也就是说我们要分析出来A等于多少了,那同学们来看一下,十传进来以后,大家看这里,这有一个指针P。是一个int类型的指针,然后呢,他用一个my local my local,然后呢,它开开辟了一个堆空间。
01:00
对,这里它开辟开辟了一个堆空间,大家看这里啊,这开辟了。开辟一个堆,动态的开辟的一个堆空间。这个空间有多大呢?其实就是四个字节。对不对,然后呢,然后他这个把N这个值放到信号P里面去,也就是说他嗯,他在这个空间里面,这个世界四个字节,它放放入了一个什么值呢?同学们注意听,放入了。放入。他放入了N这个字。N是多少呢?就是十,也就是说这个空间放了一个十进去,然后return信号P,那也就是说这个值返回的就是什么?就是就是十能理解不,那那也说这个A呢,就等于十了。紧接着呢,他又调用了这样这样一句话。大家看这里。那这句话,这句话呢,它会导致什么事间方呢?就是A加上一个返回的值,那同学们想它这里再去调用放矢,是不是又相当于开辟了又一个新的堆的空间,又放入了,放入了你传进去的这个十啊。
02:15
那也就是说这边会返回一个十不受影响,也说你原先得到了一个十放进去了,但是你第二次开辟的是一个新的对空间,就是说你每执行一次呢,就会开辟一个对空间,四个字节的对空间并不受影响,换言之,你可以这样理解。哦,这好像是我的堆。好像是我们对第一次开辟的一个空间放了一个十。对,然后第二次调用,调用放矢的话呢,又开辟一个空间,又放一个十,这两者就这个空间和这个空间呢,是相互独立的,所以说这边就会返回一个十,那这样子就会等于十加上一个十等于多少呢?等于20,各位答案出来了。
03:00
单就应该是20。选哪个呢,选择。C。30岁。没问题,第32题又是一道代码的阅读题,这道题是有是有,一定就一定要认真看啊,也不说难度不难度的问题,一定要认真看,因为它里面呢,有一些是不小心你就中了他的陷阱了,我们来看。首先呢,它先定义了一个一维,呃,这是一个一位数组,十十个数,十个成员的一个一维数组,然后for循环,For循环呢,它是在做一件什么事情,大家看它是,嗯,这个放函数,它是把。它是每每两个一组,看到没有,因为它这个是I加二嘛,所以说它是每两个一组传进去A和B,然后进行交换,这个大家有没有发现放函数的功能是要分析出来。放。这个函数AAB,这个函数的功能是干什么呀?功能是交换两个数,就是A和B这两个直径交换。
04:11
是交换。交换A和B的值能看懂吗?它是交换A和B的值,这里面呢,他就呃,他就去每两个一组的传进去,那也就是说他想干什么呢?他想这样子,这个一组进行交换,这个又是一组进行交换,这个又是一组进行交换,这个又是一组进行交换,这个又是一组进行交换。他想做这么一件事情。但是非常遗憾,它这个地方A和B默认是值传递,所以说你这里的交换并不会影响到数组C。他在这个地方又重新输出了这个数组,看到没有,这重新输出数组。它的本意是想干什么呢?想把这个数组的每两个因素进行交换。但是我们发现。
05:03
放函数。放函数这个A和B呢。它是什么呢?是直传递,就是它的这个AB是值传递。直传递呢,就不会对不会影响。不会影影响什么呢?不会影响到我们这个main main函数中的函数中的数组,哪一个数组啊,就C数组不会影响到。因此你这样输出完了过后呢,它仍然是1234567890。对,所以所以。输出后,输出后仍然是。仍然是什么?仍然是这个值,答案应该是选A。说说答案。分析出来了答案。是A。答案选A,那我再多说一句,假如它传进去是按按这个星号地址这样传的,那就不一样了啊,不是这样子啊,这个这个也不会受影响,就说他如果是把这个数组传到这里面去进行交换,那就会受影响,但是现在呢,因为他是把它每一个元素呃一个个往里面传的,所以说不会受影响,仍然是呃原来的顺序第32题。
06:19
32题呢,我们也来做一个分析,首先同学们可以看这里呢,它定义了一个结构体,同时呢定这个data是一个结构体数组,看清楚了。这句话一定要阅读出来,它是一个什么呢?是一个结构体数组。对,那也就是说同学们如果看清楚的话,这个DATA0。这个塔零呢,其实它就是一个一,一个十,而de塔看清楚了,Data塔一呢,它这里面存的就是一个二,一个20,看懂了。然后呢,大家可以看到他上来过后呢,这做了一个动作,就是让P指向这个data,那我问同学们一个问题,就是这一句话。
07:07
就这句话大家要阅读出来,这句话是表示什么意思呢?表示让P指向指向这个结构体数组。那我问大家,呃,它其实它默认指向的是这个结构体数组的第一个元素,就是实际上指向这个一的,能理解吧。就说这个P其实指向了德塔零一及P指向。指向德尔塔零一啊,德尔塔零。没问题,好,下面呢,我们再来看他做什么事情呢?哈,呃,PY,哎,PY这个PY其实等价于什么呢?其实它等价就是访问得塔零的这个Y,那当然这个就应该输出什么呢。嗯,当然他就应该输出十了,对不对,所以它输出十。输出十,然后后面它又输出这个加加,看这句话能理解什么意思吗?加加P是不是指相当于是我们结构体指针的一个运算,那这个加加完了过后,它就等价于找到得尔塔一了,能理解吗?然后访问X,显然de塔一的X呢就是二于,于是它就输出一个二,说出最后结果呢一个十,一个二答案。
08:24
出来了答案是哪一个?同学们就是我们的C,也就是说我们第33题应该是选的C答案。没有问题。几节课我们看34题,又是一个代码阅读题,还是要分析。来看一下吧,同学们,这道题呢?我说这道题其实是很容易答错的,这道题很容易答错,稍微不注意就会中陷阱,大家看这边呢,有一个一位数组,分别是1234567890I,然后呢,放关键词读这句话啊同学们看这句话。这句话呢,它将什么呢?将这个KK是数组啊,啊这个数组。
09:07
数组传递了。数组传递给放注意数组默认是什么传递?还记得吗?数组默认是传递的地址,是地址传递。所以说他在这个地方通过A去做控制,其实修改的就是幂函数里面的K数组。这个一定要理解,我们在前面讲大学生高校,呃,高校大学生C语言课程的时候,把这个讲的非常的清晰。所以说你这传的是,如果传的是一个数组名给他,那么这个A在这里面做变化的时候呢,就会直接影响到main函数里面的这些个数据,能理解哈。好,这边一定要理解,而且注意他传的是五,那五的话呢,一定要注意,也就说在这个。这个放函数中,函数中这个N呢,其实这个N其实是五。
10:05
这个N45好了,大家看这句话在做什么事情,大家能看出来吗?这个能分析出来负循环I等于零,I小于N。除以2N除以二就相当于是五除以二了吗?五除以二不就等于二了吗?对不对,相当于负I等于0I小于2I加加,然后做这个工作,大家看这句话在做什么事情啊。能看懂吗?这句话是不是把前五个数据进行交换呢?就说你看啊。呃,你I等于零嘛,零。I等于零,那么N减一减I等于几呢?N等于五。N是五吧,五减去一个一,再减去一个零,是不是就是四?也就是说它让零和四进行交换。零是它。和这个下标为零和下标为十交换,就一和五交换。
11:01
然后I再变I加加,I加加就变成了I,就变成了一,而这边呃,N减,那就是五减去一个一,再减去一个一,就变成三,那就是一和三交换,一和三交换不是这个交换吗。最后再来三和三,三和三都不用交换了,因为呃,这个时候他在不再小于二了,因为I0I等于二的时候,就不再小于二,就退出,也就是说实际上他做了件什么事情呢?把前面五个数。这个进行一个交换,而且是首尾交换。说这句话实际上是将。将这个数组哪一个数组呢?就是K这个数组。的。的前五个五个元素。元素首尾交换。首尾。首尾交换能理解,那交换完了过后,这个数组就变成什么样子了呢?
12:00
我们再说一遍哈,这是引用传递或者叫地址传递,说这个A,这里面的A呢,其实指向的是K,它这面改变会改变,直接改变我们命呃函数里面的K,也就是说这边处理完了过后呢,这个数值就变成这个德行了。这边是五。这个是四。这个是。二。这个是一,相当于说这交换,交换完了过后他又干什么呢?看同学们看它输出,但是输出的时候呢,是从下标为二输输出到下标为七,因为八不输出了,下标为二是从三开始,是不是三。起到哪里了呢?就是321678,应该是输出这几个数。那答案出来了啊,那就应该第四一个,第三一个,他应该输出什么呢。同学们看。输出。他输出的就应该是三。21678。
13:01
那答案是哪一个?是不是出来了答案?答案就是我们的D答案D就是一个答案,代码技术分析完毕。第35题,第35题呢,这个题也也是一段代码阅读题,也要花点时间,因为只要是代码你就去就就首先得把代码读懂,不然的话你做不出来。我们看这段代码呢,这是现在阅读一下X是一个二维二维数组,说这你你你把这个看出来啊。我们做一个分析。分析,一。它是一个什么呢?是一个二维数组。那大家看这个二位叔叔长什么样子呢?二位数组里面第一个元素是123,那没有给值的就是零,四。后面没有给四零五六七八九十,后面没给,值是零,那也就说这个数组它长的什么样子呢?一定要分析出来。
14:00
也就是说我们这个XX这个二维数组其实是长的这个样子,1230。四零。零零。看懂了没有,因为你没有给值的话呢,默认是零,是不是以前讲过。第三个元素是567、八。第四个元素是九。十零零好,写完,那就说X这个二位数组,其实它是长这个样子的。那下面呢,我们接着来看他做一件什么事情呢?它调用一个放函数。就下面呢,他又做了一个工作。调用了我们的这个放函数。这个方函数把X和Y传进去了,Y现在是几呢?大家看,嗯,它在这传这个Y啊,这个Y。Y其实就是把这个嗯,传了一个,传了一个数组进去,YN嘛,N等于四,其实相当于说这个Y呢,就是这个B这个数组了,然后他在这里面做了一件什么事情呢?在放函数里面,他做了这样一件事情。
15:06
什么是?大家看这句话是什么意思啊?就是这个函数到底完成一个什么功能呢?放函数完成的功能是什么?一定要分析出来这个放函数。它你看这零到N,然后BI等于A。Ii哎,Aii是不是就是它的这一个对角线的。元素的值,那也就是说这个放函数。放函数,它完成的功能,你要分析出来它的功能是。它的功能是将这个啊A。AA是一个二维数组对不对?将A的对角线。对角线的元素啊,依次依次放入。放入到哪个数组呢?B数组。
16:00
实际上分函数就是干这个事情,你你们有没有发现,就是这个是N等于,设我们刚好呢,这边也是,它是呃,它是四列的。所以说实际上它是相当于把这个呃,A的对角线的元素一是放到我们这个B数组。对后面呃,你只要把这个分析出来了,那就简单了,那就简单了,那你看一下你对角线的数据。是不是就是。一零。欺凌了。所以说将来这个数组就是这个B数组里面放的数据呢,就是。1070,也就是这个,我把这个标成另外一个颜色,大家看的比较清晰一点。对,这个呢,标成一个蓝色,这个也标成一个蓝色,这个也标成一个颜色,好吧,那也就是说我们这个B数组。B。B数组存放的是什么呢?这么几个元素就是一,零。
17:07
七零。那大家想,因为我们这个数组啊,它是传递的地址,所以说你这个B里面传放入数据了,那就相当于我们这个main函数里面的Y也放入这个数据了,能理解吗?因为它是同一个。这个地方你要不明白的话,这个题是做不出来的,最后呢,它便利了一下这个Y,显然便利Y其实就相当于便利B,因为它两个是同一个。我们讲过,宿主传递的是地址。对不对,所以说你在这里面给它赋值的时候,相当于给这个Y这个数组赋了值了,那显然数值就应该是1070,当然是它。OK,那么输出的就他答案。出来了。答案就是我们的。B答案。答案就是我们的B,答案没有问题吧,同学们。
18:01
同学们看到这儿是不是还是有点压力?说实话这些题呢,你要说你要说难呢,不是很难,但是如果说同学们没有理解,理解透前面我们讲的课程,没有没有理解到位,说实话你还是很容易出错的,因为它里面有些小陷阱在里边。好的同学们,那前面五个题呢,就给大家先评讲到这里,一会呢,我们再评讲36题。
我来说两句