牛客网-《刷C语言百题》第四期

news2025/1/17 8:51:50

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!
📃个人主页:@rivencode的个人主页
🔥系列专栏:《C语言入门必刷百题》
💬推荐一款模拟面试、刷题神器,从基础到大厂面试题👉点击跳转开启刷题模式
在这里插入图片描述

目录

  • 一.选择题
  • 二.编程题
    • 1.BC16十六进制转十进制
    • 2.BC17缩短二进制
    • 3.BC18牛牛的空格分隔
    • 4.BC19牛牛的对齐
    • 5.BC20进制A+B
  • 三.如何高效刷题

一.选择题

试题1:
在这里插入图片描述

答案:A
解析:始终记住指针变量p1,p2也是变量,不过指针变量存储的地址,比如说p1存储了某一个变量的地址,我们就说p1指向这个变量,所以只要p1,p2存储的是同一个变量的地址则他们就指向同一个变量,&p1其实就是p1,因为(解引用)与& (取地址)两个符号抵消,p1=p2(相当于将p2的内容赋给p1,则p1,p2存储的是同一个地址。)
在这里插入图片描述
补充:比如我们定义int * p1,则这个p1就是一个int * 的整形指针变量,那为什么又是我们会把p1叫做指针呢,指针与指针变量有何区别?其实指针其实就是一个地址(在32位平台就是4个字节),而指针变量顾名思义是一个变量它存储指针(地址),所以严格意义来说p1是一个指针变量,那为什么叫它指针呢?
1.叫的顺口
2.当p1作为右值的时候,p1代表的是它的内容,而指针变量的内容不就是地址(指针)嘛。
比如定义 :int p1,intp2
p2 = p1 //此时p1充当右值,代表的是p1的内容也就是将p1存储的地址赋给了p2,此时我们可以说p1是一个指针(地址)。

知识点详情参考:
指针从入门到熟练掌握
C语言指针进阶
试题2:
在这里插入图片描述

答案:C
解析:
这题主要考察了结构体内存对齐的知识:它问S(该结构体变量),地址对齐问题,其实就是结构体总大小的最大对齐数:(每个成员变量都有一个对齐数,)是成员变量的最大对齐数的整数倍,这里最大的对齐数就是 int b :4个字节。

先看内存对齐规则:
这里的大小都是以字节为单位

  1. 第一个成员在相对于结构体变量地址偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(成员变量的对齐数)的整数倍的地址处。成员变量的对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数,)是成员变量的最大对齐数的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
    在这里插入图片描述

知识点详情参考:结构体详解-内存对齐

试题3:
在这里插入图片描述

答案:D
解析:这题的关键在于前置++ 与后置++ 的区别:记住后置++不是不加,是一定要运算之后才加。
在这里插入图片描述

知识点详情参考:

试题4:
在这里插入图片描述

答案:D
解析:这题主要参考了不同指针类型、强制类型转化,这一部分知识非常重要了。

所谓强制类型转化:一定记住改变的只有类型,变量本身的内容并不会改变,只是以不同的类型去解释同一段内存中的二进制序列。
在这里插入图片描述

知识点详情参考:
我建议指针基础薄弱的一定要看看,我想一定对你们有所帮助。
指针从入门到熟练掌握
C语言指针进阶

试题5:
在这里插入图片描述

答案:B
解析:
数组名:
有两种特殊情况表示整个数组,一般情况都是数组首元素的地址。
1.&数组名:表示整个数组的地址
2.sizeof(数组名):表示求整个数组的大小

数组的最后放的是一个0,注意它放的并不是 字符’0’。
知识扩展:
字符’0’:它的ASCLL码值是48
数字0 、‘\0’、NULL其实本质都是0,只不过他们的类型不一:
数字0:类型整形
‘\0’: 作为字符串的结束标志,类型为字符型
NULL:类型为void
*

其实这个数组最后一个元素放个0,其实起到了’\0’ 的作用,因为他们两个在数值上是等价的,其实在内存中他们的两个的值的是一模一样只不过是类型不同罢了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
知识点详情参考:
指针从入门到熟练掌握
C语言指针进阶

试题6:
在这里插入图片描述

答案:C
解析:
在这里插入图片描述
按位与 按位或 按位取反
所谓双目运算符:有两个操作数,操作数必须是整数

所有的运算都是要经过CPU来执行的,执行的过程中要想内存中提取数据,而存储在内存中的数据全是补码,所以我们的运算全是针对与数据的补码

按位与运算 &
按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应二进制位相与。只有对应的两个二进制位均为1时,结果位才为1 ,否则为0。

在这里插入图片描述

按位或运算 |
按位或运算符“|”是双目运算符。 其功能是参与运算的两数各对应的二进制位相或。只要对应的二个二进制位有一个为1时,结果位就为1。

在这里插入图片描述
求反运算~
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。

在这里插入图片描述
注意:符号位照样取反

按位异或运算 ^
按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进制位相异或,当两对应的二进制位相异时结果为1,相同结果为0,

在这里插入图片描述

按为异或的特点:
最好能记住解题块的很
性质:
1.交换律 a^ b = b^a
2.结合律 a^ b ^ c = a^ (b^c)
3.任何数后零异或都是它本身
4. 自身与自身异或为0

其实上面的特点很好证明只要记住:相同为0,相异为1

知识点详情参考:C语言操作符详解

试题7:
在这里插入图片描述
在这里插入图片描述

答案:C
解析:
do-while 语句至少执行一次,A 选项错误。第一次执行后 k 自增变为1。1 < 1为假,退出循环。因此只执行 1 次。C选项正确。

试题8:
在这里插入图片描述

答案:D
解析:这题主要考察了数组指针的用法。
定义 int (*p)[5] ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是5,也可以说是p的步长。也就是说执行p+1时,p要跨过5个整型数据的长度,而int c[4][5] 其实也可以看出是一个一维数组,只不过这个数组的每个元素也是一个一维数组(int [5]),所以c是首元素的地址也就是一维数组的地址。
看下图详解:
在这里插入图片描述
其实指针、数组并不难,只要将一维数组的知识融会贯通,二维、三维…数组真的是手到擒来,因为不管是一维还是二维数组在内存中存储都是连续排布的则所有的数组都可以看成是一维数组去理解。
知识点详情扩展:

二维数组
首先看一下二维数组元素在内存中如何存储
在这里插入图片描述
以前我们的思维可能是二维数组char a[3][4]是一个三行四列这样的布局,其实在内存中真正的是所有元素都是连续存储但为什么会出现这样的结果呢。

先说结论:

不管是二维还是三维还是多维数组都可以看做是’一维数组’,就拿二维数组来说char a[3][4],数组名与 [3] 结合说明数组有三个元素,而数组存储元素的类型是char [4],我们都知道char [4]是一个一维数组的类型,总结:char a[3][4] 是一个有3个元素的数组,而每个元素是一个一维数组。

数组类型 :去掉数组名剩余的部分

int arr[10]; ->类型为int[10]表示数组存储10个整形元素
char arr[10];->类型为char[10]表示数组存储10个字符元素
int*arr[10];->类型为int*[10]表示数组存储10个整形指针
int (*parr[10])(int ,int );->类型为int(*[5])(int ,int )
表示数组存储10个函数指针

数组中元素的类型:去掉数组名与[元素个数] 剩余的部分

int arr[10]; ->数组中元素的类型为int,数组存储10个整形
char arr[10];->数组中元素的类型为char,数组存储10个字符型
int*arr[10];->数组中元素的类型为 int *,数组存储10个整形指针
int (*parr[10])(int ,int );->数组中元素的类型为int (*)(int ,int ),数组存储10个函数指针

char a[3][4];-> 去掉 a[3],剩下的 char [4]的数组中存储的元素类型,而char [4]是一个存储4个字符的一维数组,则char a[3][4]有3个元素,每个元素是一个一维数组。

则就能解释为什么二维数组的元素存储都是连续,因为char a[3][4] 是一个数组,数组三个元素是连续存储,而每个元素是一个一维数组又是连续存储的,所以整个二维数组的元素都是连续存储的。

这里我画了个 char c[4][3] ->数组有4个元素,每个元素的类型是 char [3]是一个存储三个字符的一维数组。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

试题9:
在这里插入图片描述

答案:A
解析:这道题看似很简单,但稍不注意就会选错。
详细题解看下图:

在这里插入图片描述
在这里插入图片描述

知识点详情参考:C语言操作符详解

试题10:
在这里插入图片描述

答案:A
解析:函数中的while是将连续的数字转换为long放在t中每次求完t后累加到s上,因此s为字符串中所有数字之和s=123+456+789=1368在这里插入图片描述
在这里插入图片描述

二.编程题

点击题目即可跳转刷题
这一期的题目与上一期的知识点差不多留给你们练手了
牛客网-《刷C语言百题》第三期

1.BC16十六进制转十进制

1.题目描述
在这里插入图片描述
2.解题思路
十六进制转十进制:在这里插入图片描述

3.代码实现
解法一:利用pow函数(求某个数的n次方)

int main() 
{
    int i=15;
    int sum=0;
    int j=0;
   for(i=15;i>=10;i--)
   { 
      /"16的0,1,2,3,5次方"/
      sum=sum+i*pow(16,j);
      j++;
   }  
   //%15d:控制输出结果宽度为15
   printf("%15d\n",(int)sum);
    return 0;
}

在这里插入图片描述
解法二:写一个接口函数,可以将任意十六进制的数转化为十进制数


int HecToDec(char * arr)
{
	int tmp = 0;
	int sum = 0;
	int i = 0;
	int len = strlen(arr);
	for (i = 0; i < len; i++)
	{
		switch (arr[i])
		{
			case 'A': tmp = 10; break;
			case 'a': tmp = 10; break;
			case 'B': tmp = 11; break;
			case 'b': tmp = 11; break;
			case 'C': tmp = 12; break;
			case 'c': tmp = 12; break;
			case 'D': tmp = 13; break;
			case 'd': tmp = 13; break;
			case 'E': tmp = 14; break;
			case 'e': tmp = 14; break;
			case 'F': tmp = 15; break;
			case 'f': tmp = 15; break;
			default: tmp = arr[i] - '0';
		}
		if (tmp >15 || tmp < 0)
		{
			//格式输入错误
			return -1;
		}
		sum = sum + tmp*pow(16, len - 1 - i);
	}
	//返回转化后的结果
	return sum;
}

int main()
{
   int tmp = HecToDec("abcdef");
	if (tmp != -1)
	{
		printf("%15d", tmp);
	}
   return 0;
}

2.BC17缩短二进制

1.题目描述
在这里插入图片描述

2.解题思路
解法一:加前导符#
解法二:自己加

3.代码实现
解法一:

int main()
{ 
    int a=1234;
    printf("%#o %#X",a,a);
    return 0;
}

解法二:

int main() 
{
   int a=1234;
   printf("0%o 0X%X",a,a);

   return 0;
}

3.BC18牛牛的空格分隔

1.题目描述
在这里插入图片描述
2.解题思路
在这里插入图片描述

3.代码实现

int main() 
{
    char ch;
    int  a;
    float f;
    scanf("%c\n%d\n%f",&ch,&a,&f);
    printf("%c %d %0.6f",ch,a,f);
    return 0;
}

4.BC19牛牛的对齐

1.题目描述
在这里插入图片描述

2.解题思路

C语言中%5d %05d %-5d %.5d 的区别:
在这里插入图片描述
总结:
如果d前面的是正数则右对齐,其余往左补零或空格
如果d前面的是负数则右对齐,其余往右补零或空格
超过的这个数,全取就好了

浮点数的格式也差不多,只不过中间用.分隔。

printf("%.nlf",value); /* 表示保留n位小数 */
printf("%m.nlf",value); /* 表示控制宽度为m,保留n为小数,右对齐 */
printf("%-m.nlf",value); /* 表示控制宽度为m,保留n为小数,m前面的-表示左对齐 

其实这些格式还是很有用的,尤其是输出到屏幕上的格式。
输出到屏幕上其实都是字符:这个字符包括数字,英文,汉字等其他国家的语言。
就拿汉字来说,我们用字符串可以存储汉字,但如何存储呢?
我们都知道计算机只能存储二进制序列,像ASCLL码一样,'A’用65表示,其实汉字也是一样只不过汉字比英文26个字母多的多,可能一个汉字需要几个字节来表示,当然也有不同的汉字编码。

3.代码实现

int main() 
{
   int a,b,c;
   scanf("%d %d %d",&a,&b,&c);
   printf("%d%8d%8d",a,b,c);
    return 0;
}

5.BC20进制A+B

1.题目描述
在这里插入图片描述

2.代码实现

int main() 
{
    int a,b;
    scanf("%x %o",&a,&b);
    printf("%d",a+b);
    return 0;
}

等下一期的话编程题太简单的话我就跳过了

三.如何高效刷题

如何刷题:
1.如果你是基础不太好,可以先按照题解,跟着手打代码,重点理解题目思路,将题目所用到的知识点,解题技巧提炼出来(锻炼代码能力,解题思路)。在这里插入图片描述
2.当有一定的代码能力之后,但是看题还是没有思路,可以先看解题思路理解它,然后尝试用代码去实现它。(主要锻炼代码能力,进一步锻炼解题思维)

3.拿到一个题目自己先尝试解题,最好是能将解题思路用画图的方式体现出来,这样更能加深印象,然后用代码实现,实现之后再看看题解,或者别人的解题方法,进行对比,找到最优解题思路
在这里插入图片描述
最后:在解题过程中,碰到问题如下图(题目提交后通不过,报错(代码可能有bug),尽量独立思考,可以先尝试用它的测试用例,一步一步走读代码,看看问题出现在那个地方,如果实在是没有看出来,可以将该函数拷贝到VS中进行调试代码,一定能找出来。(锻炼自己的代码调试能力)

在这里插入图片描述

最后的最后为了前途也为了钱途刷起来:

点击跳转开启刷题模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QStyleFactor和QPalette

Qt中的分格都继承自QStyle&#xff0c;QStyle类是一个抽象基类&#xff0c;封装了一个GUI的外观。 QStyle常见的子类有&#xff1a; QStyleFactory类QPalette类QStyleFactor类 函数为&#xff1a; create()创建并返回与给定键匹配的QStyle对象keys()返回有效键的列表 获取有…

面试灵活拷问:对于数据库的索引,你是怎么理解的?

文章目录一、索引的概念及作用概念作用二、索引的应用场景三、索引的相关语法1.查询索引2.创建索引3.删除索引注意四、索引背后的数据结构什么是B树B树有什么特点采用B树结构能为索引带来什么好处五、索引的分类1.唯一索引&#xff08;unique键对应的字段&#xff09;2.主键索引…

Selenium基础 — 拓展:使用浏览器加载项配置实现用户免登陆

1、什么是加载项配置 在很多情况下&#xff0c;我们在登录网站的时候&#xff0c;浏览器都会弹出一个是否保存登录账号的信息。如果我们选择保存&#xff0c;那么我们在下次登录时就不用再次输入账号&#xff0c;直接免登录了。 在我们实际的测试过程中&#xff0c;测试注册登…

系统运维利器,百万服务器运维实战总结!一文了解最新版SysAK|龙蜥技术

在刚刚结束的龙蜥峰会 eBPF & Linux 稳定性专场上&#xff0c;龙蜥系统运维 SIG Maintainer 张毅做了《SysAK 系统运维工具集》的主题演讲&#xff0c;以下为演讲实录。 大家好&#xff0c;在去年的云栖大会&#xff0c;我们在龙蜥社区开源了系统运维工具集 SysAK&#xff…

new Vue的时候到底做了什么

Vue加载流程 1.初始化的第一阶段是Vue实例也就是vm对象创建前后&#xff1a;首先Vue进行生命周期&#xff0c;事件初始化发生在beforeCreate生命周期函数前&#xff0c;然后进行数据监测和数据代理的初始化&#xff0c;也就是创建vm对象的过程&#xff0c;当vm对象创建完成就可…

【Linux】gcc的使用

文章目录一、前言二、gcc的基本使用1. 预处理2. 编译3. 汇编4. 链接三、函数库四、gcc常用选项总结一、前言 在学习本文前&#xff0c;我们先简单回顾一下源代码被转换为可执行的机器指令的每个过程&#xff1a; 预处理&#xff08;进行宏替换)编译&#xff08;生成汇编)汇编…

windows什么录屏软件好用,windows屏幕录制软件

大部分人的电脑都是windows电脑&#xff0c;所以很多人都在找适合windows系统的录屏工具&#xff0c;windows什么录屏软件好用&#xff1f;我们到底该选择哪个录屏工具呢&#xff1f;今天我们就来给大家介绍windows版本的录屏工具。 一、易我录屏助手 这个工具很多人都比较熟悉…

艾美捷人重组MEGACD40L蛋白(可溶性)实例展示

艾美捷人重组MEGACD40L蛋白&#xff08;可溶性&#xff09;是一种高活性蛋白质&#xff0c;其中两个三聚体CD40配体分子通过脂联素/ACRP30/AdipoQ的胶原结构域人工连接。这种蛋白质非常有效地模拟体内CD40L的自然膜辅助聚集。 艾美捷人重组MEGACD40L蛋白&#xff08;可溶性&…

openEuler快速入门(二)-openEuler命令行基础操作

系列文章目录 第一章 openEuler快速入门(一)-openEuler操作系统介绍 文章目录系列文章目录前言一、shell是什么二、Linux命令行操作技巧三、基础命令3.1、Linux命令分类3.2、目录和文件3.2.1 相对路径和绝对路径3.2.2 处理目录的常用命令ls&#xff1a;cd&#xff1a;pwd&…

供应N3-PEG-COOH,Azide-PEG-acid,叠氮-聚乙二醇-羧基可增加溶解度

一&#xff1a;产品描述 1、名称 英文&#xff1a;Azide-PEG-acid&#xff0c;N3-PEG-COOH 中文&#xff1a;叠氮-聚乙二醇-羧基 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Carboxylic acid PEG 4、分子量&#xff1a;可定制&#xff0c;1000、2000、…

搭建Redis -Sentinel架构

准备服务器 master节点&#xff1a;192.168.1.121 从节点1&#xff1a;192.168.1.122 从节点2&#xff1a;192.168.1.123 安装详细步骤 1、下载安装包 https://redis.io/download/ 2、进入工作目录 $cd /home 3、解压安装包 $tar -zxvf redis-6.2.6.tar.gz 4、建立软连接 $l…

OpenCV_06 图像平滑:图像噪声+图像平滑+滤波

文章目录1 图像噪声1.1 椒盐噪声1.2 高斯噪声1.3 瑞利噪声1.4 伽马噪声1.5 指数噪声1.6 均匀噪声2 滤波器2.1 均值滤波器2.1.1 算数平均值滤波器2.1.2 几何均值滤波器2.1.3 谐波平均滤波器2.1.4 反谐波平均滤波器2.2 统计排序滤波器2.2.1 中值滤波器2.2.2 最大值滤波器2.2.3 最…

翻开spring源码横看竖看,满屏只有四个字,看不懂啊。幸好我有大神的深度剖析spring源码,轻松看懂

前言 有一天&#xff0c;我翻开源码横看竖看&#xff0c;满屏只看到四个字&#xff0c;我看不懂啊。 所以是不是曾和我一样迷失在毫无头绪的源码里&#xff0c;在各种类和方法里翻山越岭&#xff0c;却如同管中窥豹。是的话&#xff0c;要不今晚早点睡&#xff1f; 呸&#x…

前端学习路线(二)

在前端学习路线&#xff08;一&#xff09;一章中我们讲了关于前端三剑客和jq与js的问题&#xff0c;并且简要的说明了js高级是什么&#xff0c;那在本章节我们主要从如何学习js高级开始进行讲述&#xff0c;并对es6如何学习&#xff0c;bootstrap学不学和学什么&#xff0c;并…

Tomcat部署及优化

目录 一. Tomcat的介绍 1.2 Tomcat核心组件 1.2.1 核心组件的作用 1.3 servlet简介 1.4 JSP介绍 1.5 Tomcat功能组件结构 1.6 Tomcat请求过程 二.Tomcat服务部署 2..2 安装JDK​编辑​编辑​编辑 2.3 设置JDK环境变量​编辑​编辑 2.5 优化tomcat启动速度 2.6 tom…

【JavaScript】制作一个抢红包雨页面

开发H5项目&#xff0c;有时会遇到一个需求&#xff0c;需要制作抢红包&#xff0c;或者下红包雨的网页&#xff0c;这个实现步骤&#xff0c;如果拿现成的改来做是容易的&#xff0c;但是想着全靠自己做是不容易的&#xff0c;接下来开始讲&#xff0c;想不想自己做&#xff0…

嵌入式开发学习之--点亮LED灯(下)

上篇我们主要学习的是环境搭建和实际操作&#xff0c;这篇详细记录一下整个思考的过程。 首先&#xff0c;我们需要想一个问题&#xff0c;这个灯为什么会亮&#xff1f; 物理上来说&#xff0c;LED灯属于发光二极管&#xff0c;只要有正确的电压就会发亮。也就是说&#xff…

01 DevOps 之 Git 命令使用

1. 前言 由于项目没有外网&#xff0c;需要在内网打镜像。但自己对git 还不是太熟悉。看着pipline 一脸懵逼。所有针对git 命令在工作中常用的参数及用法简单学习记录下。因为git 是DevOps中的编码的一部分&#xff0c;下面先介绍下DevOps整体的框架。 1.1 DevOps介绍 DevOp…

Linux-磁盘分区,挂载

Linux分区 Linux来说无论有几个分区&#xff0c;分给哪一个目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构&#xff0c;Linux中每个分区都是用来组成文件系统的一部分 Linux采用了一种载入的处理方法&#xff0c;它的整个文件系统包含了…

智能运维应用之道,告别企业数字化转型危机

面临的问题及挑战 数据中心发展历程 2000 年中国数据中心始建&#xff0c;至今已经历以下 3 大阶段。早期&#xff1a;离散型数据中心 IT 因以项目建设为导向&#xff0c;故缺乏规划且无专门运维管理体系&#xff0c;此外&#xff0c;开发建设完的项目均是独立运维维护&#…