【备战软考】刷题篇——C语言高频考点

这篇文章总结一下软考里的C语言高频考点。

我们提取一下关键词,按字节编址,小端存储,int和short长度为32位和16位,数据按双字节对齐存储。

我们先来看看第一个空,这个结构体变量的首地址是0xC008,问我们0xC008这个地方的内容是什么。这是第一个知识点,结构体变量的首地址和这个结构体变量的第一个成员的首地址是同一个地方。

因此0xC008这个地方存放的是int a的值。题目说int占32位也就是4个字节。然后a的值是273,因此完整的32位的值应该是0x00 00 01 11,然后是按端存储的,因此0xC008这个地方的值是0x11。

然后下一个空,成员c的地址,结构体的成员存放位置都是在一起的,

我们按照顺序数下来,a是int,占32位4个字节,b是char,占8位一个字节(虽然题目没说,但是根据编程的常识可以推断出),但是题目说是按数据双字节对齐,我们先稍微了解一下双字节对齐是什么意思。

数据按双字节对齐存储是指在计算机内存中,数据的存储位置按照双字节(即16位或2字节)的整数倍进行排列。这意味着数据的起始地址是2的倍数,以确保处理器能够高效地访问这些数据。

所以char虽然只占一个字节,但是由于是双字节对齐,所以它实际上占的是两个字节。

所以c的地址是0xC008+4+2也就是0xC00E。

这题考察的是C语言如何存储联合体,联合体占用的内存大小是联合体中所有成员里占用内存最大的那个大小。

这题中联合体里最大的数据类型是double,占的是8字节,因此我们选择A。

顺便一提,结构体占用的内存大小是结构体内所有成员占用内存大小的总和。

题目让我们看看程序输出的结果。

就是打印两次数据,打印的数据是运行函数的结果。

第一次传入的是5,第二次传入的是10。

这道题或者是这类题我们只需要手动模拟程序运行即可,很容易就可以知道答案选择A。

这道题的考点在于函数体内部的静态变量a。静态变量的特点就是只初始化一次,因此当我们第二次调用这个函数的时候,静态变量a的值就变成了5(第一次调用的时候累加了5),因此第二次返回的值是5+10 = 15。

这道题是让我们补充代码,要实现的逻辑是递推斐波那契数。斐波那契数就是当前的数是前两个数的和(从第三个数开始)。理解之后就不难选出D这个选项了。

这类型的题不仅会出现在选择题中,在下午的大题中也常常会出现,因此我们还是要把编程这个基本功打扎实了。

这道题问我们这个循坏会执行几次。使用的是while的循环,判断条件是size这个变量需要大于等于100,每次会后自减一次。因为是后自减,且判断条件是大于等于,因此在正常情况下是执行101次的。

但是我们要仔细看,size的类型是unsigned char,也就是说是无符号类型,所以它的值永远不会为负数,也就是永远不会小于0,所以这个程序会进入死循环。

还是斐波那契数,问我们分别用的什么方法。

首先穷举搜索法肯定不对,穷举需要把所有可能都列出来,而理论上斐波那契数可以是无穷多个。

剩下就是递推法和迭代法。

迭代法是通过从一个初始估计值开始,重复应用某种规则或函数,以逐步接近所需解的过程。每次迭代都是基于前一次迭代的结果进行的。

递推法是一种通过已知的旧值(或初始值)递推出新值的方法。递推关系通常表示为数学公式或方程组。

这俩其实挺像的,新手朋友可能不太好区分,我有个简单的方法可以进行判断。

使用for循环去求结果的就是递推法,而使用递归的就是迭代法。使用递归的判断依据就是函数的返回值是这个函数的调用结果。

这道题也是让我们求出程序运行的结果。考察的点就是宏定义和Switch。

宏定义是直接替换的。因此程序a中经过宏定义替换后的结果是 y = x / x * x 。而x是2,因此结果是y=2。可能会有小伙伴会先去计算f(x)等于4,然后再算x/4等于0.5,但是f(x)是宏定义,我们要做的就是直接替换,而不是先计算再替换,这个是需要注意的点。

第二个是Switch,我们学习C语言的时候,老师应该都有教Switch的每个case都需要break。这是因为如果没有break的话,那么当前case执行完之后还会接着执行下一个case。

所以在程序b中,c经历了c++;c+=2;c+=5,所以最后的结果是c=11。如果case 1中有break,那么c的结果就是9,因为无论如何,Switch中的default都会执行。

这道题还是问我们程序输出什么。

i是sizeof(a),而j是strlen(a)。

区别就是两个函数的底层逻辑,使用sizeof的话,会返回的是当前这个变量占用的内存大小,而strlen是返回字符串的长度。

“china”的长度是5,因为j是5,而sizeof(a)返回的会是7,因为a本质上是char类型的数组,这个数组的长度是7,每个char占一个字节,因此i是7。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值