C语言经典笔试题目分析(持续更新)
1. 描述下面代码中两个static 各自的含义
static void func (void)
{static unsigned int i;
}
- static void func(void) 中的 static
作用对象:函数 func。
含义:
限制函数的作用域(链接属性),使其仅在当前源文件(.c 文件)内可见,其他源文件无法调用此函数。
未加 static 的函数默认为 extern(外部链接),其他文件可以通过声明调用;而 static 函数是“内部链接”的,仅用于文件内封装。
- static unsigned int i; 中的 static
作用对象:局部变量 i。
含义:
延长变量的生命周期,使其从“自动存储期”变为“静态存储期”。
未加 static 的局部变量会在函数调用结束后销毁,而 static 变量会一直存在,直到程序结束。
特性:
变量 i 的作用域仍限制在函数 func 内部(只能在函数内访问)。
变量 i 的值会保留,每次调用 func 时,i 的值是上一次调用结束后的值。
变量 i 在程序启动时初始化为 0(若未显式初始化)。
总结
static 位置 | 作用对象 | 核心意义 | 影响范围 |
---|---|---|---|
static void func(void) | 函数 | 限制函数的作用域(内部链接) | 文件级可见性 |
static unsigned int i; | 局部变量 | 延长变量的生命周期(静态存储期) | 变量的存储与持久化 |
2. 写出执行下面代码后变量a的值:
unsigned int a,b=3;
void move(unsigned int *p,unsigned int val)
{P = &val;
}void main (void)
{a = b++;move(&a,b);
}
-
全局变量a和b的声明。b初始化为3,a未初始化,但因为是全局变量,默认初始化为0吗?或者可能在C语言中全局变量默认初始化为0?我记得是的,但这里a被显式赋值了,所以可能不需要考虑初始值。
-
主函数main开始执行。首先执行a = b++。这里的b++是后置递增,即先赋值b的当前值给a,然后b自增1。所以执行完这一步后,a应该是3,而b变成4。
-
接着调用move函数,传入&a(a的地址)和b的值(此时b是4)。在move函数内部,参数p接收的是a的地址,val接收的是4。然后在函数内部,执行p = &val。这里需要注意的是,p是一个指针变量,传递的是指针的副本。也就是说,在函数内部,p被改为指向val的地址,但这个改变不会影响到函数外部的指针,因为C语言是值传递,函数内部修改的是指针的副本,而不是原来的指针。
因此,move函数执行后,并没有改变a的值,因为函数内部只是修改了局部指针p的指向,而没有通过指针去修改a的值。所以a仍然保持原来的值,也就是3。
不过,这里可能存在一个误解:在函数move中,p被赋值为val的地址。但是val是一个局部变量,当函数move结束后,val的地址就不再有效了。即使通过p修改了指向的内容,但由于val已经不存在了,这可能导致未定义行为。不过在这个代码中,并没有通过*p来修改val的值,只是改变了p的指向。因此,实际上move函数并没有对a进行任何修改,所以a的值仍然保持为3。
3. 在32位的单片机系统中,下面的结构体长度是多少?
typedef struct {
short a;
char b;
char c;
int d;
}struct1;typedef struct {
char a;
short b;
unsigned char c;
int d;
}struct2;
分析如下:
在 32 位单片机系统 中,结构体的长度由成员变量的内存对齐规则决定。以下是具体分析:
typedef struct {short a; // 2 字节(对齐到 2 的倍数地址)char b; // 1 字节(对齐到 1 的倍数地址)char c; // 1 字节(对齐到 1 的倍数地址)int d; // 4 字节(对齐到 4 的倍数地址)
} struct1;
内存布局分析:
short a:占 2 字节(地址 0-1)。
char b:占 1 字节(地址 2)。
char c:占 1 字节(地址 3)。
int d:需对齐到 4 的倍数地址。当前地址为 4(跳过 0-3),占 4-7 字节。
总长度:8 字节(无需额外填充,已满足最大对齐值 4 的倍数)。
typedef struct {char a; // 1 字节(对齐到 1 的倍数地址)short b; // 2 字节(对齐到 2 的倍数地址)unsigned char c; // 1 字节(对齐到 1 的倍数地址)int d; // 4 字节(对齐到 4 的倍数地址)
} struct2;
内存布局分析:
char a:占 1 字节(地址 0)。
short b:需对齐到 2 的倍数地址。当前地址为 1,填充 1 字节到地址 2,占 2-3 字节。
unsigned char c:占 1 字节(地址 4)。
int d:需对齐到 4 的倍数地址。当前地址为 5,填充 3 字节到地址 8,占 8-11 字节。
总长度:12 字节(满足最大对齐值 4 的倍数)。
最终结果
结构体 | 总长度(字节) | 关键对齐分析 |
---|---|---|
struct1 | 8 | 成员顺序紧凑,填充较少。 |
struct2 | 12 | 因 short 和 int 对齐导致多次填充。 |
4.请使用 typedef定义一个数据类型 func_t为指向 void 型函数的函数指针,再使用此数据类型定义一个指向 void 型函数的函数指针,并通过此指针来调用函数 test。
typedef int (*fun_ptr)(int,int);
// 声明一个指向同样参数、返回值为int的函数指针类型
typedef_______
void test(void);
void main()
{
}
代码实现:
#include <stdio.h>// 使用 typedef 定义函数指针类型 func_t
typedef void (*func_t)(void);// 定义目标函数 test
void test(void) {printf("Test function called.\n");
}int main() {// 声明 func_t 类型的函数指针并指向 testfunc_t func_ptr = test; // 等价于 func_ptr = &test// 通过函数指针调用 testfunc_ptr(); // 等价于 (*func_ptr)();return 0;
}
5.请编写宏定义实现以下功能:
1)将无符号整数a的第1位置1,同时保证其它位的值不改变;
2)将无符号整数b的第5位清0,同时保证其它位的值不改变;
3)计算出任意结构体类型的常数组(如struct tt tab[]
)的元素个数
#include <stdio.h>// 宏定义
#define SET_BIT1(a) ((a) |= (1U << 1)) // 第 1 位置 1
#define CLEAR_BIT5(b) ((b) &= ~(1U << 5)) // 第 5 位清 0
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) // 计算数组元素个数int main() {// 测试置位和清零unsigned int a = 0;SET_BIT1(a);printf("a = 0x%08X\n", a); // 输出 0x00000002unsigned int b = 0xFFFFFFFF;CLEAR_BIT5(b);printf("b = 0x%08X\n", b); // 输出 0xFFFFFFDF// 测试数组元素个数计算struct tt { int x; char y; };struct tt tab[] = { {1, 'a'}, {2, 'b'}, {3, 'c'} };printf("Array size: %zu\n", ARRAY_SIZE(tab)); // 输出 3return 0;
}
1U << 1
:生成掩码 0b00000010(假设为 8 位)。
注意事项
-
位操作宏:
-
1U 确保掩码为无符号整数,避免符号扩展问题。
-
括号包裹参数 (a) 和 (b),防止宏展开时的运算符优先级错误。
-
-
数组大小宏:
-
仅适用于静态数组,若传入指针(如函数参数退化的指针),宏会失效。
-
arr 必须为数组名,不能是指针或动态分配的内存。
-
6.请按照说明实现下面的函数:
/*功能:把十六进制数转换为字符,如0xA8转换为字母A和数字8
*参数:hex是待转换的十六进制数:char1和char2是转换后的字符的存储指针
*返回值:返回0表示转换成功,返回-1表示参数错误或转换失败*/
int hex_to_chars(unsigned char hex,char *charl, char *char2)
{
}
实现:
#include <stdio.h>int hex_to_char(unsigned char hex, char *char1, char *char2) {// 检查指针有效性if (char1 == NULL || char2 == NULL) {return -1;}// 检查hex是否为有效单字节十六进制数(0x00~0xFF)if (hex > 0xFF) {return -1;}// 处理高四位unsigned char high = (hex >> 4) & 0x0F;// 处理低四位unsigned char low = hex & 0x0F;// 转换为字符*char1 = (high < 10) ? ('0' + high) : ('A' + high - 10);*char2 = (low < 10) ? ('0' + low) : ('A' + low - 10);return 0;
}/* 使用示例 */
int main() {char c1, c2;unsigned char test_num = 0xA8;if (hex_to_char(test_num, &c1, &c2) == 0) {printf("0x%02X -> '%c' '%c'\n", test_num, c1, c2); // 输出:0xA8 -> 'A' '8'}// 错误测试:传入空指针if (hex_to_char(0x12, NULL, &c2) == -1) {printf("Invalid parameters!\n");}return 0;
}
代码说明:
-
参数校验
-
首先检查char1和char2是否为NULL,避免空指针解引用。
-
检查hex是否超过单字节范围(0x00~0xFF),若超过则返回错误。
-
-
位操作提取高低四位
-
high = (hex >> 4) & 0x0F:右移4位获取高四位并屏蔽其他位。
-
low = hex & 0x0F:直接屏蔽高四位获取低四位。
-
-
数值转字符
-
0-9:直接转换为字符’0’-‘9’(‘0’ + value)。
-
10-15:转换为大写字母’A’-‘F’(‘A’ + value - 10)。
-
-
返回值
- 成功返回0,失败返回-1(参数错误或数值越界)。
相关文章:
C语言经典笔试题目分析(持续更新)
1. 描述下面代码中两个static 各自的含义 static void func (void) {static unsigned int i; }static void func(void) 中的 static 作用对象:函数 func。 含义: 限制函数的作用域(链接属性),使其仅在当前源文件&…...

AI工具分享篇 | recraft.ai + figma 复刻技术路线图
recraft 介绍 recraft.ai 主要生成和编辑适合网站、印刷和营销的各种风格的矢量艺术、图标、3d图像和插图。其矢量化功能可将路线图转化为一个矢量图。 recraft 的注册流程非常的简单,邮箱注册即可,无需科学上网,3分钟就能搞定。看不懂英文…...

部署安装jenkins.war(2.508)
实验目的:部署jenkins,并与gitlab关联bulid 所需软件:jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机:8.10具有java环境,内存最少为4G,cpu双核 目录 jdk安装 …...

JS手写代码篇---手写 Object.create
JS手写代码篇 在做手写题的时候,我们要思考两个问题 这个代码的作用是什么能够实现的效果是什么样子 1. 手写 Object.create 思路:创造一个对象,类似于Object.create()方法>将obj作为原型 // 手写 Object.create function create (ob…...
前端最新面试题及答案 (2025)
前端最新面试题及答案 (2025) JavaScript 核心 1. ES6+ 新特性 问题: 请解释 ES6 中 let/const 与 var 的区别,以及箭头函数的特点。 答案: let/const vs var: 作用域: let/const 是块级作用域,var 是函数作用域 变量提升: var会提升变量,let/const不会(有暂时性死区) 重…...
视频编解码学习十二之Android疑点
一、android.view.SurfaceControl.setDisplaySurface的作用 android.view.SurfaceControl.setDisplaySurface 是 Android 系统中一个 native 层级别的 API,主要用于 设置某个物理显示屏(Display)的输出 Surface,属于 SurfaceFlin…...
绘制时间对应的数据曲线
头文件#pragma once #include "ChartControl.h" #include <vector> #include "DBOperate.h&...
HTTP 请求中 Content-Type 头部
HTTP 请求中 Content-Type 头部可以设置的各种不同的传输格式。multipart/form-data 只是其中一种,主要用于传输包含文件的数据。 以下是一些常见的 HTTP 请求体的 Content-Type 及其用途: 常见的数据传输格式 (Content-Type) 列表: application/json: 描述: 用于传输 JSO…...

spring boot Controller 和 RestController 的区别
spring boot Controller 和 RestController 的区别 5.3.1常用注解 Spring MVC控制器中常使用的注解有如下几种。 Controller Controller 标记在类上。使用Controller 标记的类表示是Spring MVC的Controller对象。分发处理器将会扫描使用了该注解的类,并检测其中的…...

LeRobot 项目部署运行逻辑(七)—— ACT 在 Mobile ALOHA 训练与部署
全部流程为:硬件配置 -> 环境安装 -> 遥操作数据采集 -> 数据集可视化 -> 策略训练 -> 策略评估 在之前的笔记中已经完成了绝大部分,最后再记录一下最后的训练部署,算是最简单的部分了 目录 1 ACT 训练 2 ALOHA 部署 3 更…...

高频交直流电流测量技术:射频PA与MEMS测试的简单解决方案
随着5G通信和智能传感器技术的快速发展,传统电流测量手段已难以满足现代电子设备的测试需求。最新一代交直流混合测量探头通过突破性的技术创新,正在重新定义射频功率器件和微机电系统的测试标准。 射频功率放大器测试新范式: 在5G基站等高…...

原生微信小程序 textarea组件placeholder无法换行的问题解决办法
【问题描述】 微信小程序原生代码,使用文本域,placeholder使用\n 没有效果,网上找了一堆方案说使用 也没有效果 最后在一个前端大佬博客,找到解决办法,CSS设置word-wrap: break-word; white-space: pre-line; 【解决办…...

网络协议分析 实验二 IP分片与IPv6
文章目录 索引及重要内容实验2 IP 高级实验实验2.1 IPv4协议分片实验实验2.2 IPV6协议实验2.3 ARP初级 索引及重要内容 实验2 IP 高级实验 实验2.1 IPv4协议分片实验 icmp的不可达报文 实验2.2 IPV6协议 实验2.3 ARP初级 arp –a 查看ARP缓存表内容 arp –s IP地址(格式&…...

QT6 源(101)篇一:阅读与注释 QPlainTextEdit,其继承于QAbstractScrollArea,属性学习与测试
(1) (2) (3)属性学习与测试 : (4) (5) 谢谢...
【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for
【ROS】郭老二博文之:ROS目录 1、问题描述 在ROS2工程中,编译使用Qt实现的库,在其它ROS2包链接该库时,报错: /usr/bin/ld: XXX undefined reference to `vtable for2、原因分析 查看链接失败的几个函数接口都是,信号函数(signals 标记的函数)。因为信号函数都只有定…...

工业大数据的定义
目录 工业大数据的定义 工业大数据发展历程 工业大数据的特征 工业大数据的处理流程 工业大数据在处理上面临的挑战 工业大数据的有效处理方案 工业大数据处理相关案例 数益工联 x TDengine 中天钢铁 x TDengine 广州某企业工业互联网项目 x TDengine 格创东智 x TD…...

126.在 Vue 3 中使用 OpenLayers 实现绘制正方形、正三角形、正五边形
🗺️ 项目效果(先看效果) 支持点击按钮绘制图形,效果如下: ✅ 正三角形 ✅ 正方形 ✅ 正五边形 ✅ 支持停止绘制 📌 前言 在 Web GIS 的实际项目中,我们经常需要绘制一些规则的图形,比如:正方形、正三角形、正五边形等,这在标注地块、规划图形、布设区域等场景中都…...
大数据 vs. 小数据:AI项目中数据规模与质量的权衡之道
大数据 vs. 小数据:AI项目中数据规模与质量的权衡之道 引言:数据时代的辩证法则 在AI领域,一个根本性悖论日益凸显:数据规模与质量往往呈现此消彼长的关系。Google Brain团队的研究揭示,当数据规模增长10倍时&#x…...
互联网大厂Java求职面试实战:Spring Boot到微服务全景解析
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 2. 我的免费工具站: 欢迎访问 https://tools-6wi.pages.dev/ 😁 3. 毕业设计专栏,毕业…...
最新版VSCode通过SSH远程连接Ubuntu 16.04等旧版Linux的方法
根据官方文档Remote Development FAQ - Can I run VS Code Server on older Linux distributions?,自Visual Studio Code 1.99起,VSCode Remote - SSH Server由于运行库依赖更新,会无法连接到旧版Linux发行版上。但是好在官方在文档中还给了…...
SQL Server中delete table和truncate table删除全表数据哪个快?
目录 1.TRUNCATE 2.DELETE 总结 在 SQL Server 中,DELETE 和 TRUNCATE 都可以用来删除表中的数据,但它们执行的方式和性能影响是不同的。这里简要说明两者的区别以及哪个更快: 1.TRUNCATE 速度: TRUNCATE 是一个DDLÿ…...

3DVR制作的工具或平台
3DVR(三维虚拟现实)是利用三维图像技术和虚拟现实技术,将真实场景进行三维扫描并转换成计算机可识别的三维模型,使用户能够在虚拟空间中自由漫游,体验身临其境的感觉。3DVR技术结合了全景拍摄和虚拟现实,提…...
qt QMessageBox 的详细解析
以下是关于 QMessageBox 的详细解析,涵盖其核心功能、使用方法、高级特性及常见场景示例。 1. QMessageBox 的核心作用 QMessageBox 是 Qt 中用于快速创建标准化对话框的类,常用于以下场景: 信息提示(如操作成功/失败)。警告或错误通知(如文件未保存)。用户决策(如确认…...

高吞吐与低延迟的博弈:Kafka与RabbitMQ数据管道实战指南
摘要 本文全面对比Apache Kafka与RabbitMQ在数据管道中的设计哲学、核心差异及协同方案。结合性能指标、应用场景和企业级实战案例,揭示Kafka在高吞吐流式处理中的优势与RabbitMQ在复杂路由和低延迟传输方面的独特特点;介绍了使用Java生态成熟第三方库(如Apache Kafka Clie…...
在 Spring Boot 中实现分库分表的全面指南
分库分表(Database Sharding)是一种数据库架构优化技术,通过将数据分散到多个数据库或表中,以应对高并发、大数据量场景,提升系统性能和扩展性。在 Spring Boot 中,分库分表可以通过框架支持(如…...
关于大语言模型的困惑度(PPL)指标优势与劣势
1. 指标本身的局限性 与人类感知脱节: PPL衡量的是模型对词序列的预测概率(基于交叉熵损失),但低困惑度未必对应高质量的生成结果。例如: 模型可能生成语法正确但内容空洞的文本(PPL低但质量差)…...

如何使用WordPress SEO检查器进行实时内容分析
在这篇文章中,我们将带你从头开始了解如何在WordPress中使用SEO检查工具进行实时内容分析。这篇文章面向初学者,帮助你理解SEO的重要性以及如何通过工具提高文章的搜索引擎优化(SEO)效果。 一、什么是SEO内容分析? 内…...

C语言:深入理解指针(5)
目录 一、回调函数 二、qsort 使用举例 三、模拟qsort 一、回调函数 回调函数就是一个通过函数指针调用的函数。 举个例子: int Add(int x, int y) {return xy; }void test(int (*pf)(int, int)) {int r pf(10 ,20);printf("%d\n" ,r); }int main()…...
前端如何获取电脑唯一编码
在前端开发中,出于安全和隐私的考虑,浏览器不允许直接获取硬件的唯一标识(如 MAC 地址、CPU 序列号等)。但可以通过以下方法生成设备指纹(Device Fingerprint),近似实现设备唯一标识:…...

IEEE出版|连续多年稳定检索|第三届信号处理与智能计算国际学术会议(SPIC2025)
【重要信息】 会议官网: www.ic-spic.com 会议日期:2025年11月28-30日 会议地点:中国 广州 截稿日期:2025年11月10日 接受或拒绝通知日期:提交后7个工作日 【征稿主题】 人工智能和机器学习 计算机系统和架构 …...