欢迎找我进行职业规划,超值的自我投资 -> 嵌入式软件工程师一对一指导
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("%d\n", 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 + 1,s变为1。 -
当
i = 1时,b[1] = 2,所以a[b[1]] = a[2] = 3。因此,s = s + 3,s变为4。 -
当
i = 2时,b[2] = 1,所以a[b[2]] = a[1] = 2。因此,s = s + 2,s变为6。 -
当
i = 3时,b[3] = 3,所以a[b[3]] = a[3] = 4。因此,s = s + 4,s变为10。 -
当
i = 4时,b[4] = 0,所以a[b[4]] = a[0] = 1。因此,s = s + 1,s变为11。
最后,程序输出 s 的值是 11。
3.在函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了函数funA,则()
A 称为函数的直接递归调用
B 称为函数的间接递归调用
C 称为函数的循环调用
D C语言中不允许这样的递归调用
解析:
-
直接递归调用:指的是一个函数在其执行过程中直接调用自身。
-
间接递归调用:涉及两个或更多函数,其中一个函数调用另一个函数,而那个函数又直接或间接地调用回原来的函数。
-
循环调用:通常指的是一系列函数相互调用,形成一个闭环,但没有明确的递归结构(即不是函数自己调用自己)。
题目中的情况:函数funA调用了函数funB,而函数funB又调用了函数funA。
-
这不是直接递归调用,因为直接递归调用要求函数自己调用自己,而这里是两个函数相互调用。
-
这是间接递归调用的一个例子,因为
funA和funB通过彼此调用形成了一个间接的递归链。 -
虽然函数间相互调用形成了一个闭环,但这不是传统意义上的循环调用,因为循环调用通常不涉及递归的概念。
-
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));}
解析;
题目定义了三个字符串常量 p1, p2, 和 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
未完待续,持续更新!
以防后边找不到可以点赞收藏下!
欢迎找我进行职业规划,超值的自我投资 -> 嵌入式软件工程师一对一指导









