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 + 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
未完待续,持续更新!以防后边找不到可以点赞收藏下!