当前位置: 首页 > article >正文

嵌入式C语言面试题 - 2024/11/18

欢迎找我进行职业规划,超值的自我投资 -> 嵌入式软件工程师一对一指导

转载请注明来源:


  1. 下边代码,x值是?

int x=10;x+ = 3+x%(3);

解析:

  1. 初始值:x = 10

  2. 计算 x % 3

    • 10 % 3 的结果是 1,因为 10 除以 3 的余数是 1。

  3. 计算 3 + x % 3

    • 3 + 1 的结果是 4

  4. 计算 x += 3 + x % 3

    • 相当于 x = x + 4

    • 当前的 x 是 10,所以 x = 10 + 4

  5. 最后,x 的结果是 14

因此,执行完 x+=3+x%(3); 后,x 的值是 14

2.下边代码输出结果是?

int **pp, *p, a=10, b=20;pp = &p;p = &a;p = &b;printf("%d,%d", *p, **pp)

解析:

  1. int **pp, *p, a=10, b=20;

    • pp 是一个指向指针的指针(即二级指针)。

    • p 是一个指向整型的指针(即一级指针)。

    • a 和 b 是整型变量,分别初始化为 10 和 20。

  2. pp = &p;

    • 这行代码将 p 的地址赋值给 pp。现在 pp 指向 p

  3. p = &a;

    • 这行代码将 a 的地址赋值给 p。现在 p 指向 a,因此 *p 的值是 10。

  4. p = &b;

    • 紧接着,这行代码将 b 的地址赋值给 p。现在 p 指向 b,因此 *p 的值变为 20。

    • 注意,此时 pp 仍然指向 p,但 p 的值已经改变,指向了 b 而不是 a

  5. printf("%d,%d", *p, **pp);

    • *p:由于 p 指向 b,所以 *p 的值是 b 的值,即 20。

    • **pppp 指向 p,而 p 指向 b,所以 **pp 相当于 *p,其值也是 b 的值,即 20。

因此,printf("%d,%d", *p, **pp); 的输出结果是 20,20

3.定义语句int *ptr [4];,下面等价的定义语句是?

A int ** ptr;

B int( * ptr) [4];

C int ptr[4];

D int * (ptr [4]);

解析:

在C语言中,int *ptr[4]; 定义了一个包含4个整型指针的数组。每个数组元素都是一个指向整型的指针。

A. int **ptr;

  • 这定义了一个指向指针的指针,而不是一个指针数组。因此,这与原定义不等价。

B. int (*ptr)[4];

  • 这定义了一个指向包含4个整数的数组的指针。虽然这里有括号和[4],但它并不表示一个指针数组,而是表示一个指向数组的指针。因此,这也与原定义不等价。

C. int ptr[4];

  • 这定义了一个包含4个整数的数组,而不是指针数组。因此,这与原定义不等价。

D. int *(ptr[4]);

  • 这实际上与int *ptr[4];是等价的。它定义了一个名为ptr的数组,该数组包含4个元素,每个元素都是指向整型的指针。这里的括号是可选的,因为[]的优先级高于*,所以int *ptr[4];int *(ptr[4]);表示的是同一种类型。

因此,与原定义int *ptr[4];等价的定义语句是D选项:int *(ptr[4]);

4.下边的代码,输出是多少?​​​​​​​

#include <stdio.h>
void foo(int b[][3]){     ++b;       b[1][1] = 9;}
int main(){      int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};      foo(a);       printf("%d", a[2][1]);}

解析:

在这个C语言程序中,有一个二维数组a和一个函数foo,该函数接收一个二维数组作为参数。

  1. 二维数组a被初始化为:

    1 2 3 4 5 6 7 8 9制代码

  2. main函数中,数组a被传递给函数foo。在C语言中,当二维数组作为参数传递给函数时,它实际上是通过指向其第一个元素(即第一个子数组)的指针来传递的。因此,foo函数中的参数b是一个指向包含3个整数的数组的指针。

  3. foo函数中,执行了++b;操作。这个操作使b指针指向了a的第二个子数组(即{4, 5, 6})。此时,b[0]指向{4, 5, 6}b[1]指向{7, 8, 9}

  4. 接下来,执行b[1][1] = 9;。由于b现在指向a的第二个子数组,所以b[1][1]实际上是指a[2][1](即原数组中的8所在的位置)。这行代码将a[2][1]的值更改为9。

  5. 回到main函数,执行printf("%d", a[2][1]);。由于a[2][1]的值在foo函数中被更改为9,所以输出将是9。

因此,程序的输出是9


未完待续,持续更新!

以防后边找不到可以点赞收藏下!

欢迎找我进行职业规划,超值的自我投资 -> 嵌入式软件工程师一对一指导


http://www.kler.cn/a/406836.html

相关文章:

  • Windows VScode+Latex环境
  • c++11的动态类型
  • 在 Ubuntu 上安装 Yarn 环境
  • YOLOV5/rknn生成可执行文件部署在RK3568上
  • 【题解】—— LeetCode一周小结46
  • 推荐一款专业电脑护眼工具:CareUEyes Pro
  • 【HM-React】01. React基础-上
  • element-plus教程:Layout 布局
  • 从容器到Podman:一个全方位的剖析
  • 电子应用设计方案-20:智能电冰箱系统方案设计
  • 人工智能与自动驾驶:从梦想到现实
  • 事务、视图、索引
  • Kafka-Consumer理论知识
  • “iOS profile文件与私钥证书文件不匹配”总结打ipa包出现的问题
  • R package安装的几种方式
  • gstream插件编译笔记【1.16.3】
  • 仿axios,封装微信小程序的请求
  • Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)(很详细)
  • RHCD-----shell
  • 【Isaac Sim】相关问题汇总
  • CANDENCE: 绘制好的封装元件 刷新(Refresh) 和 替换 (Replace)焊盘
  • 【多模态】Flamingo模型技术学习
  • 瑞佑液晶控制芯片RA6807系列介绍 (三)软件代码详解 Part.9(PNG透明图片的显示)
  • 110. UE5 GAS RPG 实现玩家角色数据存档
  • 大模型专栏--什么是大模型
  • CIO40: 数字化转型之U型思考