加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

嵌入式面试题练习1

11/18 15:20
606
阅读需 8 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1.设有定义char *p[]={"Shanghai","Beijing","Honkong"};则结果为j字符的表达式是()

A *p[1] +3

B *(p[1] +3)

C *(p[3] +1)

D p[3] [1]

解析:

p 是一个指针数组,其中每个元素都指向一个字符串字面量。

A. *p[1] + 3
这个表达式首先解引用 p[1](即指向 "Beijing" 的指针),得到 'B' 字符,然后将其 ASCII 值加 3,结果是 'E' 的 ASCII 值,而不是 'j'。

B. *(p[1] + 3)
这个表达式首先计算 p[1] + 3,它是指向 "Beijing" 字符串中第四个字符(从0开始计数)的指针(即指向 'j' 的指针),然后通过解引用得到 'j' 字符。这是正确的表达式。

C. *(p[3] + 1)
这个表达式试图访问 p[3],但数组 p 只有三个元素(索引为 0, 1, 2),所以 p[3] 是未定义的,这将导致未定义行为。(下角标错误)

D. p[3][1]
同样,这个表达式也试图访问 p[3],这是未定义的,因此这个表达式也是错误的。

综上所述,正确答案是 B,即 *(p[1] + 3),这个表达式将返回 'j' 字符。

2.有以下程序, 程序运行后的输出结果是( )

#include "stdio.h"
void main() {    int a[5] = {1, 2, 3, 4, 5}, b[5] = {0, 2, 1, 3, 0}, i, s = 0;    for(i=0; i < 5; i++) s = s + a[b[i]];    printf("%dn", s);}

解析:

首先,我们有两个数组 a 和 b

int a[5] = {1, 2, 3, 4, 5};int b[5] = {0, 2, 1, 3, 0};

数组 a 包含值 {1, 2, 3, 4, 5},数组 b 包含值 {0, 2, 1, 3, 0}

接下来,我们有一个循环,它遍历数组 b 的每个元素,并使用这些元素作为数组 a 的索引来累加值:

for(i=0; i < 5; i++)     s = s + a[b[i]];

让我们逐步执行这个循环:

当 i = 0 时,b[0] = 0,所以 a[b[0]] = a[0] = 1。因此,s = s + 1s 变为 1

当 i = 1 时,b[1] = 2,所以 a[b[1]] = a[2] = 3。因此,s = s + 3s 变为 4

当 i = 2 时,b[2] = 1,所以 a[b[2]] = a[1] = 2。因此,s = s + 2s 变为 6

当 i = 3 时,b[3] = 3,所以 a[b[3]] = a[3] = 4。因此,s = s + 4s 变为 10

当 i = 4 时,b[4] = 0,所以 a[b[4]] = a[0] = 1。因此,s = s + 1s 变为 11

最后,程序输出 s 的值是 11

3.在函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了函数funA,则()

A 称为函数的直接递归调用

B 称为函数的间接递归调用

C 称为函数的循环调用

D C语言中不允许这样的递归调用

解析:

直接递归调用:指的是一个函数在其执行过程中直接调用自身。间接递归调用:涉及两个或更多函数,其中一个函数调用另一个函数,而那个函数又直接或间接地调用回原来的函数。循环调用:通常指的是一系列函数相互调用,形成一个闭环,但没有明确的递归结构(即不是函数自己调用自己)。

题目中的情况:函数funA调用了函数funB,而函数funB又调用了函数funA

这不是直接递归调用,因为直接递归调用要求函数自己调用自己,而这里是两个函数相互调用。这是间接递归调用的一个例子,因为funAfunB通过彼此调用形成了一个间接的递归链。虽然函数间相互调用形成了一个闭环,但这不是传统意义上的循环调用,因为循环调用通常不涉及递归的概念。C语言中允许这样的递归调用,只要递归不是无限的(即必须有终止条件来防止栈溢出)。

综上所述,这种情况最符合间接递归调用的定义。因此,正确答案是 B 称为函数的间接递归调用。

4.执行以下语句,输出结果为()

#include <stdio.h>
int main( ) {  char *p1 = "hello";  char *p2 = "world";  char *p3 = "a piece of cake";  char *str[] = {p1, p2, p3};  printf("%c", *(str[0] + 1));}

解析;

题目定义了三个字符串常量 p1p2, 和 p3,然后创建了一个字符指针数组 str,该数组包含这三个字符串的地址。接下来,我们使用 printf 函数来打印 str[0](即 p1 指向的字符串 "hello")的第二个字符。

char *p1 = "hello";  // p1 指向字符串 "hello"char *p2 = "world";  // p2 指向字符串 "world"char *p3 = "a piece of cake";  // p3 指向字符串 "a piece of cake"
char *str[] = {p1, p2, p3};  // str 是一个字符指针数组,包含 p1, p2, 和 p3 的地址
printf("%c", *(str[0] + 1));  // 打印 str[0](即 p1)指向的字符串的第二个字符

 

str[0] 是 p1,它指向字符串 "hello"str[0] + 1 是将指针 p1 向前移动一个字符位置,因此它现在指向 "hello" 中的 'e'

*(str[0] + 1) 解引用这个新的指针位置,得到字符 'e'

因此,printf("%c", *(str[0] + 1)); 会打印字符 'e'

所以,程序的输出结果是:e

未完待续,持续更新!以防后边找不到可以点赞收藏下!

相关推荐

电子产业图谱