内容正文:
《编程语言基础-C语言》高等教育出版社(第5版)
第八章 指针 章节过关卷(二)(解析版)
考试时间:90分钟 满分:100分
姓名 班级 学号
一、单项选择题(本题共25小题,每题2分,共50分)
1、若有定义 int a = 10, *p = &a;,则以下表达式值为10的是( )
A. p B. &a C. *p D. &p
2、以下程序的输出结果是( )
main() {
int x = 3, y = 4, *px = &x, *py = &y;
*px = *px + *py;
printf("%d,%d", x, y);
}
A. 3,4 B. 7,4 C. 7,7 D. 3,7
3、以下关于指针变量初始化的说法,正确的是( )
A. int *p = 100; 是合法的,p指向地址100
B. int *p; *p = 5; 是合法的
C. int a; int *p = &a; 是合法的
D. int *p = NULL; 不合法
4、若有定义 int a[5] = {0,1,2,3,4}, *p = a + 2;,则p[1]的值是( )
A. 1 B. 2 C. 3 D. 4
5、以下程序的输出结果是( )
main() {
int a[3] = {5, 6, 7};
int *p = a;
printf("%d", p[2] - *(p + 1));
}
A. 0 B. 1 C. 2 D. 3
6、关于指向数组的指针变量,以下说法错误的是( )
A. 指针变量可以指向数组元素
B. 指针变量可以指向整个数组
C. 可以通过指针移动来遍历数组
D. 数组名是一个指针变量
7、以下程序段中,能正确输出字符串"Hello"的是( )
A. char *p = "Hello"; printf("%s", p);
B. char s[] = "Hello"; char *p = s; printf("%s", p);
C. char s[] = "Hello"; printf("%s", s);
D. 以上都对
8、以下程序的输出结果是( )
main() {
char *p = "C Programming";
p += 2;
puts(p);
}
A. C Programming B. Programming
C. rogramming D. C Pro
9、以下程序的功能是计算字符串中字符的个数(不含'\0'),划线处应填( )
int str_len(char *s) {
int n = 0;
while (________)n++;
return n;
}
main() {
char str[] = "Test";
printf("%d", str_len(str));
}
A. *s B. *s++ C. *++s D.s++
10、以下程序的输出结果是( )
void add(int *a, int *b) {
*a = *a + 10;
*b = *b + 10;
}
int main() {
int x = 1, y = 2;
add(&x, &y);
printf("%d,%d", x, y);
return 0;
}
A. 1,2 B. 11,12 C. 11,2 D. 1,12
11、若有定义 int a[3][2] = {{1,2},{3,4},{5,6}};,则*(*(a+1)+1)的值是( )
A. 2 B. 3 C. 4 D. 5
12、以下程序的输出结果是( )
main() {
int a[2] = {10, 20};
int *p = a;
*p++ = 30;
printf("%d,%d", a[0], a[1]);
}
A. 30,20 B. 10,30 C. 30,10 D. 10,20
13、以下关于指针运算的叙述,正确的是( )
A. 两个指针相加可以得到一个新的地址
B. 两个指针相减得到的是地址之差(字节数)
C. 指针与整数相加,指针值增加该整数乘以基类型字节数
D. 指针不能进行自增自减运算
14、以下程序的输出结果是( )
void change(int *p) {
p = (int *)malloc(sizeof(int));
*p = 100;
}
main() {
int a = 5;
change(&a);
printf("%d", a);
}
A. 5 B. 100 C. 随机值 D. 编译错误
15、若有定义 char *p = "Hello";,则执行p[1] = 'a';后的结果是( )
A. 字符串变为"Hallo" B. 程序运行时异常
C. 编译错误 D. 字符串变为"Hello"
16、以下程序段中,指针p指向数组a的首地址,则能正确输出数组所有元素的是( )
A. for (p = a; p < a + 5; p++) printf("%d", *p);
B. for (int i = 0; i < 5; i++) printf("%d", p[i]);
C. for (int i = 0; i < 5; i++) printf("%d", *(p + i));
D. 以上都对
17、以下程序的输出结果是( )
int main() {
int a = 12, b = 8;
int *p = &a, *q = &b;
*p = *p * *q;
printf("%d", *p);
return 0;
}
A. 12 B. 8 C. 96 D. 20
18、关于字符串指针作为函数参数,以下说法正确的是( )
A. 不能通过指针参数修改原字符串
B. 只能传递字符数组,不能传递字符串常量
C. 形参可以是char *
D. 实参必须是字符数组名
19、以下程序的输出结果是( )
main() {
int a[3] = {1, 2, 3};
int *p = a;
printf("%d", *(p + 1) + *(p + 2));
}
A. 2 B. 3 C. 5 D. 6
20、若有定义 int a[2][2] = {{1,2},{3,4}};,则*(a[1] + 0)的值是( )
A. 1 B. 2 C. 3 D. 4
21、以下程序的功能是通过指针实现两个整数的交换,划线处应填( )
void swap(int *x, int *y) {
int t;
t = *x;
*x = *y;
________;
}
A. *y = t B. y = t C. *y = *x D. t = *y
22、以下程序的输出结果是( )
int main() {
char s[] = "ABCDE";
char *p = s + 2;
printf("%c", *(p + 1));
return 0;
}
A. A B. B C. C D. D
23、若有定义 int a[5] = {2,4,6,8,10}, *p = a;,则表达式*p + 3的值是( )
A. 2 B. 5 C. 6 D. 8
24、以下关于指针作为函数参数的叙述,错误的是( )
A. 形参是指针变量,实参是地址
B. 可以通过指针修改主调函数中的变量
C. 数组名作为实参时,形参可以写成指针形式
D. 指针参数不能接收普通变量的地址
25、以下程序的输出结果是( )
main() {
int a[3] = {1, 2, 3};
int *p = a;
p++;
*p = 10;
p++;
*p = 20;
printf("%d", a[1] + a[2]);
}
A. 12 B. 13 C. 30 D. 23
二、多选题(本题共5小题,每题4分,共20分)
1、以下关于指针的叙述,正确的有( )
A. 指针变量中只能存放地址
B. 可以通过指针间接访问它所指向的变量
C. 指针变量的长度由基类型决定
D. 指针变量可以指向自己
2、以下选项中,能够使指针p指向数组a的第3个元素的有( )
A. p = a + 2; B. p = &a[2];
C. p = a; p = p + 2; D. p = a[2];
3、以下关于字符指针的叙述,正确的有( )
A. char *p = "text"; 可以定义指针指向字符串常量
B. 可以通过p[i]访问字符串中的字符
C. 可以通过指针修改字符串常量中的字符
D. 字符串常量存储在静态存储区
4、关于指针作为函数参数,下列说法正确的有( )
A. 可以实现“双向传递”数据
B. 形参是指针变量,实参是地址
C. 数组名作为实参时,形参可写为int *
D. 使用指针参数可以避免大型结构体的值传递开销
5、以下关于指针运算的表达式中,正确的有( )
A. p++ B. p - q(同类型指针)
C. p + q D. p > q
解析:指针可以自增;同类型指针可相减;同类型指针可比较大小。C中指针不能相加。
三、判断题(本题共10小题,每题2分,共20分)
1、指针变量被定义为int *p;,则*p表示指针变量p的值。( )
2、指针变量可以指向任何类型的变量,不需要类型匹配。( )
3、指向一维数组的指针,可以通过加减整数遍历数组元素。( )
4、char s[] = "abc"; 和 char *p = "abc"; 中,s和p都可以修改字符串内容。( )
5、两个指针可以相减,结果是一个整数值,表示地址之差的字节数。( )
6、指针变量的值可以被改变,而数组名的值不能被改变。( )
7、空指针(NULL)指向地址0,访问该地址是安全的。( )
8、指向同一数组的两个指针可以用关系运算符比较大小。( )
9、函数参数中使用指针,可以使得被调函数修改主调函数中的变量。( )
10、int *p = 0; 与 int *p = NULL; 不等价。( )
四、填空题(本题共5小题,每题2分,共10分)
1、以下程序段中,指针p指向数组a的首地址,请填空,使程序输出数组所有元素的值。( )
int a[5] = {2, 4, 6, 8, 10};
int *p;
for (p = a; p < a + 5; p++)
printf("%d ", ________);
2、以下程序的功能是通过指针逆序输出字符串,请填空。( )
void rev(char *s) {
char *t = s;
while (*t) t++;
t--;
while (t >= s) {
printf("%c", ________);
t--;
}
}
3、以下程序段执行后,输出结果为 ( )。
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int *p = a[0];
printf("%d", *(p + 4));
}
4、以下程序的功能是计算两个整数的和,请填空。( )
void sum(int *a, int *b, int *result) {
________ = *a + *b;
}
main() {
int x = 3, y = 5, s;
sum(&x, &y, &s);
printf("%d", s);
}
5、以下程序段执行后,输出结果为 ( )。
main() {
char *p = "C\0Language";
printf("%s", p);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
《编程语言基础-C语言》高等教育出版社(第5版)
第八章 指针 章节过关卷(二)(解析版)
考试时间:90分钟 满分:100分
姓名 班级 学号
一、单项选择题(本题共25小题,每题2分,共50分)
1、若有定义 int a = 10, *p = &a;,则以下表达式值为10的是( )
A. p B. &a C. *p D. &p
答案:C
解析:*p是指针p指向的变量a的值,即10。A和B输出地址,D输出指针变量p本身的地址。
2、以下程序的输出结果是( )
main() {
int x = 3, y = 4, *px = &x, *py = &y;
*px = *px + *py;
printf("%d,%d", x, y);
}
A. 3,4 B. 7,4 C. 7,7 D. 3,7
答案:B
解析:*px = *px + *py → x = x + y = 3+4=7,y不变,输出7,4。
3、以下关于指针变量初始化的说法,正确的是( )
A. int *p = 100; 是合法的,p指向地址100
B. int *p; *p = 5; 是合法的
C. int a; int *p = &a; 是合法的
D. int *p = NULL; 不合法
答案:C
解析:C正确定义并初始化指针;A中直接将整型常量赋给指针,通常不合法;B中野指针赋值危险;D中NULL是合法空指针。
4、若有定义 int a[5] = {0,1,2,3,4}, *p = a + 2;,则p[1]的值是( )
A. 1 B. 2 C. 3 D. 4
答案:C
解析:p指向a[2]=2,p[1]等价于*(p+1),指向a[3]=3。
5、以下程序的输出结果是( )
main() {
int a[3] = {5, 6, 7};
int *p = a;
printf("%d", p[2] - *(p + 1));
}
A. 0 B. 1 C. 2 D. 3
答案:B
解析:p[2]=7,*(p+1)=6,差为1。
6、关于指向数组的指针变量,以下说法错误的是( )
A. 指针变量可以指向数组元素
B. 指针变量可以指向整个数组
C. 可以通过指针移动来遍历数组
D. 数组名是一个指针变量
答案:D
解析:数组名是地址常量,不是变量,不能作为左值。A、B、C正确。
7、以下程序段中,能正确输出字符串"Hello"的是( )
A. char *p = "Hello"; printf("%s", p);
B. char s[] = "Hello"; char *p = s; printf("%s", p);
C. char s[] = "Hello"; printf("%s", s);
D. 以上都对
答案:D
解析:A中p指向字符串常量首地址;B中p指向数组首地址;C中数组名即地址。三种均能正确输出。
8、以下程序的输出结果是( )
main() {
char *p = "C Programming";
p += 2;
puts(p);
}
A. C Programming B. Programming
C. rogramming D. C Pro
答案:B
解析:p初始指向'C',p+=2指向'p '(空格),puts输出从p开始的字符串" Programming"。
9、以下程序的功能是计算字符串中字符的个数(不含'\0'),划线处应填( )
int str_len(char *s) {
int n = 0;
while (________)n++;
return n;
}
main() {
char str[] = "Test";
printf("%d", str_len(str));
}
A. *s B. *s++ C. *++s D.s++
答案:B
解析:指针s后移,直到遇到'\0',循环次数等于字符串长度。len("Test")=4。
10、以下程序的输出结果是( )
void add(int *a, int *b) {
*a = *a + 10;
*b = *b + 10;
}
int main() {
int x = 1, y = 2;
add(&x, &y);
printf("%d,%d", x, y);
return 0;
}
A. 1,2 B. 11,12 C. 11,2 D. 1,12
答案:B
解析:通过指针修改实参,x=1+10=11,y=2+10=12。
11、若有定义 int a[3][2] = {{1,2},{3,4},{5,6}};,则*(*(a+1)+1)的值是( )
A. 2 B. 3 C. 4 D. 5
答案:C
解析:a+1指向第二行,*(a+1)是第二行首地址(即a[1]),+1指向第二行第二列,取值为4。
12、以下程序的输出结果是( )
main() {
int a[2] = {10, 20};
int *p = a;
*p++ = 30;
printf("%d,%d", a[0], a[1]);
}
A. 30,20 B. 10,30 C. 30,10 D. 10,20
答案:A
解析:*p++ = 30,先*p = 30,然后p++。所以a[0]=30,a[1]不变为20。
13、以下关于指针运算的叙述,正确的是( )
A. 两个指针相加可以得到一个新的地址
B. 两个指针相减得到的是地址之差(字节数)
C. 指针与整数相加,指针值增加该整数乘以基类型字节数
D. 指针不能进行自增自减运算
答案:C
解析:指针加法按元素大小缩放;指针不能相加;指针相减得到元素个数差,不是字节数;指针可以自增自减。
14、以下程序的输出结果是( )
void change(int *p) {
p = (int *)malloc(sizeof(int));
*p = 100;
}
main() {
int a = 5;
change(&a);
printf("%d", a);
}
A. 5 B. 100 C. 随机值 D. 编译错误
答案:A
解析:change函数中形参p是局部变量,修改p不影响实参。a的值未被修改,输出5。注意:若想修改a需*p=100,但这里p被重新赋值了,所以失效。
15、若有定义 char *p = "Hello";,则执行p[1] = 'a';后的结果是( )
A. 字符串变为"Hallo" B. 程序运行时异常
C. 编译错误 D. 字符串变为"Hello"
答案:B
解析:p指向字符串常量,常量区不可修改,通常会导致段错误或未定义行为。
16、以下程序段中,指针p指向数组a的首地址,则能正确输出数组所有元素的是( )
A. for (p = a; p < a + 5; p++) printf("%d", *p);
B. for (int i = 0; i < 5; i++) printf("%d", p[i]);
C. for (int i = 0; i < 5; i++) printf("%d", *(p + i));
D. 以上都对
答案:D
解析:三种方式均能正确遍历数组输出元素。
17、以下程序的输出结果是( )
int main() {
int a = 12, b = 8;
int *p = &a, *q = &b;
*p = *p * *q;
printf("%d", *p);
return 0;
}
A. 12 B. 8 C. 96 D. 20
答案:C
解析:*p * *q = a * b = 12*8=96,赋给a,输出96。
18、关于字符串指针作为函数参数,以下说法正确的是( )
A. 不能通过指针参数修改原字符串
B. 只能传递字符数组,不能传递字符串常量
C. 形参可以是char *
D. 实参必须是字符数组名
答案:C
解析:形参可以是char *,实参可以是数组名或字符串常量;如果指向字符数组,可以通过指针修改;如果指向常量,则不能修改。A、B、D均错误。
19、以下程序的输出结果是( )
main() {
int a[3] = {1, 2, 3};
int *p = a;
printf("%d", *(p + 1) + *(p + 2));
}
A. 2 B. 3 C. 5 D. 6
答案:C
解析:*(p+1)=2,*(p+2)=3,和为5。
20、若有定义 int a[2][2] = {{1,2},{3,4}};,则*(a[1] + 0)的值是( )
A. 1 B. 2 C. 3 D. 4
答案:C
解析:a[1]是第二行首地址,+0指向第二行第一列,值为3。
21、以下程序的功能是通过指针实现两个整数的交换,划线处应填( )
void swap(int *x, int *y) {
int t;
t = *x;
*x = *y;
________;
}
A. *y = t B. y = t C. *y = *x D. t = *y
答案:A
解析:标准交换三步:t=*x; *x=*y; *y=t;
22、以下程序的输出结果是( )
int main() {
char s[] = "ABCDE";
char *p = s + 2;
printf("%c", *(p + 1));
return 0;
}
A. A B. B C. C D. D
答案:D
解析:s+2指向'C',p+1指向'D',输出'D'。
23、若有定义 int a[5] = {2,4,6,8,10}, *p = a;,则表达式*p + 3的值是( )
A. 2 B. 5 C. 6 D. 8
答案:B
解析:*p=2,2+3=5。注意*p+3不是*(p+3)。
24、以下关于指针作为函数参数的叙述,错误的是( )
A. 形参是指针变量,实参是地址
B. 可以通过指针修改主调函数中的变量
C. 数组名作为实参时,形参可以写成指针形式
D. 指针参数不能接收普通变量的地址
答案:D
解析:指针参数可以接收普通变量的地址(通过&取地址),D错误。
25、以下程序的输出结果是( )
main() {
int a[3] = {1, 2, 3};
int *p = a;
p++;
*p = 10;
p++;
*p = 20;
printf("%d", a[1] + a[2]);
}
A. 12 B. 13 C. 30 D. 23
答案:C
解析:p初始指向a[0]=1;p++指向a[1]=2,改为10;p++指向a[2]=3,改为20;a[1]+a[2]=10+20=30。
二、多选题(本题共5小题,每题4分,共20分)
1、以下关于指针的叙述,正确的有( )
A. 指针变量中只能存放地址
B. 可以通过指针间接访问它所指向的变量
C. 指针变量的长度由基类型决定
D. 指针变量可以指向自己
答案:ABD
解析:指针变量存放地址;通过*运算符间接访问;指针变量长度相同;可以指向自己(如int *p = &p;但需强制转型)。C错误。
2、以下选项中,能够使指针p指向数组a的第3个元素的有( )
A. p = a + 2; B. p = &a[2];
C. p = a; p = p + 2; D. p = a[2];
答案:ABC
解析:D中a[2]是元素值,不是地址。
3、以下关于字符指针的叙述,正确的有( )
A. char *p = "text"; 可以定义指针指向字符串常量
B. 可以通过p[i]访问字符串中的字符
C. 可以通过指针修改字符串常量中的字符
D. 字符串常量存储在静态存储区
答案:ABD
解析:C错误,字符串常量不可修改。
4、关于指针作为函数参数,下列说法正确的有( )
A. 可以实现“双向传递”数据
B. 形参是指针变量,实参是地址
C. 数组名作为实参时,形参可写为int *
D. 使用指针参数可以避免大型结构体的值传递开销
答案:ABCD
解析:所有选项均正确。
5、以下关于指针运算的表达式中,正确的有( )
A. p++ B. p - q(同类型指针)
C. p + q D. p > q
答案:ABD
解析:指针可以自增;同类型指针可相减;同类型指针可比较大小。C中指针不能相加。
三、判断题(本题共10小题,每题2分,共20分)
1、指针变量被定义为int *p;,则*p表示指针变量p的值。( )
答案:×
解析:p的值是地址,*p是p指向的变量的值。
2、指针变量可以指向任何类型的变量,不需要类型匹配。( )
答案:×
解析:指针类型必须与指向的变量类型匹配,否则容易出错。
3、指向一维数组的指针,可以通过加减整数遍历数组元素。( )
答案:√
解析:指针加1移动一个元素。
4、char s[] = "abc"; 和 char *p = "abc"; 中,s和p都可以修改字符串内容。( )
答案:×
解析:s是数组,可修改;p指向常量,不可修改。
5、两个指针可以相减,结果是一个整数值,表示地址之差的字节数。( )
答案:×
解析:结果表示元素个数差,不是字节数。
6、指针变量的值可以被改变,而数组名的值不能被改变。( )
答案:√
解析:指针是变量,数组名是常量。
7、空指针(NULL)指向地址0,访问该地址是安全的。( )
答案:×
解析:访问NULL指针通常导致程序崩溃。
8、指向同一数组的两个指针可以用关系运算符比较大小。( )
答案:√
解析:可以比较前后位置关系。
9、函数参数中使用指针,可以使得被调函数修改主调函数中的变量。( )
答案:√
解析:通过地址传递实现。
10、int *p = 0; 与 int *p = NULL; 不等价。( )
答案:×
解析:NULL通常定义为0,两者等价。
四、填空题(本题共5小题,每题2分,共10分)
1、以下程序段中,指针p指向数组a的首地址,请填空,使程序输出数组所有元素的值。( )
int a[5] = {2, 4, 6, 8, 10};
int *p;
for (p = a; p < a + 5; p++)
printf("%d ", ________);
答案:*p
解析:取当前指针指向的元素值。
2、以下程序的功能是通过指针逆序输出字符串,请填空。( )
void rev(char *s) {
char *t = s;
while (*t) t++;
t--;
while (t >= s) {
printf("%c", ________);
t--;
}
}
答案:*t
解析:从后往前输出字符。
3、以下程序段执行后,输出结果为 ( )。
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int *p = a[0];
printf("%d", *(p + 4));
}
答案:5
解析:p指向a[0][0],p+4指向a[1][1](按行存储,偏移4个int),值为5。
4、以下程序的功能是计算两个整数的和,请填空。( )
void sum(int *a, int *b, int *result) {
________ = *a + *b;
}
main() {
int x = 3, y = 5, s;
sum(&x, &y, &s);
printf("%d", s);
}
答案:*result
解析:通过指针间接赋值给result指向的变量。
5、以下程序段执行后,输出结果为 ( )。
main() {
char *p = "C\0Language";
printf("%s", p);
return 0;
}
答案:C
解析:字符串遇'\0'结束,只输出"C"。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$