内容正文:
《编程语言基础-C语言》高等教育出版社(第5版)
第八章 指针 章节过关卷(一)(原卷版)
考试时间:90分钟 满分:100分
姓名 班级 学号
一、单项选择题(本题共25小题,每题2分,共50分)
1、关于指针变量的定义,以下写法正确的是( )
A. int *p; B. int p*;
C. *int p; D. int *p, q;
2、若有定义 int a = 5, *p = &a;,则以下能正确输出变量a值的是( )
A. printf("%d", p); B. printf("%d", *p);
C. printf("%d", &a); D. printf("%d", *a);
3、以下程序的输出结果是( )
main() {
int a = 10, b = 20, *p, *q;
p = &a;
q = &b;
*p = *q;
printf("%d,%d", a, b);
}
A. 10,20 B. 20,20 C. 10,10 D. 20,10
4、若有定义 int a[5] = {1,2,3,4,5}, *p = a;,则以下表达式中值为4的是( )
A. *(p + 3) B. p[3] C. *(a + 3) D. 以上都是
5、下列语句中,将指针p指向数组a的第3个元素的是( )
A. p = a + 2; B. p = &a[2]; C. p = a[2]; D. A和B都正确
6、以下程序的输出结果是( )
main() {
int a[3] = {10, 20, 30};
int *p = a;
printf("%d", *(p + 1) + *(p + 2));
}
A. 30 B. 40 C. 50 D. 60
7、关于指向字符串的指针变量,以下说法正确的是( )
A. char *p = "hello"; 等价于 char s[] = "hello";
B. 不能通过指针修改字符串常量的内容
C. 指针变量p可以指向字符数组
D. 以上都正确
8、以下程序的输出结果是( )
main() {
char str[] = "World";
char *p = str;
p += 2;
printf("%s", p);
}
A. World B. orld C. rld D. ld
9、以下程序的输出结果是( )
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
main() {
int a = 3, b = 5;
swap(&a, &b);
printf("%d,%d", a, b);
}
A. 3,5 B. 5,3 C. 3,3 D. 5,5
10、若有定义 int a[5] = {1,2,3,4,5}, *p = a + 2;,则表达式 p[-1] 的值是( )
A. 1 B. 2 C. 3 D. 4
11、以下程序的输出结果是( )
void fun(int *p) {
*p = *p + 10;
}
main() {
int x = 5;
fun(&x);
printf("%d", x);
}
A. 5 B. 10 C. 15 D. 编译错误
12、以下程序中,通过指针遍历数组并求和,划线处应填( )
int sum(int *arr, int n) {
int s = 0, *p;
for (p = arr; p < arr + n; p++)
________;
return s;
}
A. s += *p B. s += p C. s += arr[p] D. s += p[0]
13、以下程序的输出结果是( )
main() {
char s[] = "C Program";
char *p = s;
while (*p != ' ') p++;
printf("%s", p + 1);
}
A. C Program B. Program C. C D. ram
14、若有定义 int a[3][2] = {{1,2},{3,4},{5,6}};,则 *(a[1] + 1) 的值是( )
A. 2 B. 3 C. 4 D. 5
15、以下关于指针运算的说法,正确的是( )
A. 两个指针可以相加
B. 两个指针可以相减,结果表示相差的元素个数
C. 指针可以和浮点数相加
D. 指针不能自增自减
16、以下程序的输出结果是( )
main() {
char *p = "abc";
char *q = "abc";
if (p == q)
printf("Equal");
else
printf("Not equal");
}
A. Equal B. Not equal
C. 编译错误 D. 运行时错误
17、以下函数的功能是求字符串的长度,划线处应填( )
int mylen(char *s) {
int n = 0;
while (________) {
n++;
s++;
}
return n;
}
A. *s B. *s != '\0' C. s != '\0' D. A和B都正确
18、若有定义 int a[5] = {1,2,3,4,5}, *p = a;,则以下表达式中与*(p + 2)不等价的是( )
A. p[2] B. a[2] C. *(a + 2) D. *p[2]
19、以下程序的输出结果是( )
void fun(int *p, int n) {
for (int i = 0; i < n; i++)
*(p + i) += i;
}
main() {
int a[3] = {1, 2, 3};
fun(a, 3);
printf("%d", a[1]);
}
A. 1 B. 2 C. 3 D. 4
20、若有定义 char str[10] = "Hello", *p = str;,则执行p = p + 2;后,printf("%c", *p);输出( )
A. H B. e C. l D. l(第二个l)
21、以下程序的输出结果是( )
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int *p = a[0];
printf("%d", *(p + 4));
}
A. 3 B. 4 C. 5 D. 6
22、关于指针作为函数参数的叙述,正确的是( )
A. 可以使被调函数修改主调函数中变量的值
B. 只能传递数组的地址
C. 实参必须是指针变量
D. 形参不能是指针
23、以下程序的输出结果是( )
main() {
int a = 1, b = 2;
int *p = &a, *q = &b;
*p = *q;
p = q;
printf("%d,%d", a, b);
}
A. 2,2 B. 1,2 C. 2,1 D. 1,1
24、以下程序段中,试图通过指针修改字符串常量,正确的是( )
A. char *p = "abc"; *p = 'A';
B. char s[] = "abc"; char *p = s; *p = 'A';
C. char *p = "abc"; p[0] = 'A';
D. A和C均可
25、以下程序的输出结果是( )
void fun(int *a, int *b) {
int *t;
t = a;
a = b;
b = t;
}
main() {
int x = 5, y = 7;
fun(&x, &y);
printf("%d,%d", x, y);
}
A. 5,7 B. 7,5 C. 5,5 D. 7,7
二、多选题(本题共5小题,每题4分,共20分)
1、以下关于指针的说法,正确的有( )
A. 指针变量中存放的是地址
B. 指针变量必须先赋值才能使用
C. 不同类型的指针变量长度可能不同
D. 可以给指针变量赋NULL
2、以下选项中,能够将指针p指向数组a的第2个元素的有( )
A. p = a + 1;
B. p = &a[1];
C. p = a[1];
D. p = a; p++;
3、以下关于指针与数组的叙述,正确的有( )
A. 数组名是地址常量,不能被赋值
B. 指针变量可以指向数组元素
C. 通过指针可以像数组一样使用下标
D. *(p + i)等价于p[i]
4、以下关于指针作为函数参数的叙述,正确的有( )
A. 可以实现在函数内部修改主调函数的变量值
B. 形参可以声明为指针类型
C. 实参可以是变量的地址
D. 实参可以是数组名
5、以下关于指向字符串的指针的说法,正确的有( )
A. char *p = "hello"; 可以用 p[0] = 'H' 修改
B. char s[] = "hello"; char *p = s; 可以通过p修改数组中的字符
C. char *p = "hello"; 和 char s[] = "hello"; 的内存存储方式不同
D. 可以通过指针移动来遍历字符串
三、判断题(本题共10小题,每题2分,共20分)
1、指针变量中存放的是整型数值,可以直接参与算术运算。( )
2、NULL是一个宏定义,表示空指针,值为0。( )
3、两个不同类型的指针可以直接相互赋值。( )
4、数组名是一个指针变量,可以指向其他数组。( )
5、char *p = "abc"; 中的字符串"abc"存储在常量区,不可修改。( )
6、指针变量只能进行加法和减法运算,不能进行乘除运算。( )
7、两个同类型的指针相减的结果是一个整数值,表示它们之间相差的元素个数。( )
8、指向整型变量的指针和指向字符型变量的指针,其长度相同。( )
9、可以通过指针变量直接修改字符串常量中的字符。( )
10、在函数参数中,int a[] 和 int *a 是完全等价的。( )
四、填空题(本题共5小题,每题2分,共10分)
1、以下程序段中,指针p指向数组a的首地址,请填空,使程序输出数组所有元素的值。( )
int a[5] = {1,2,3,4,5};
int *p;
for (p = a; p < a + 5; p++)
printf("%d ", ________);
2、以下程序段的功能是通过指针实现字符串复制,请填空。( )
void mycpy(char *dest, char *src) {
while (________) {
*dest = *src;
dest++;
src++;
}
*dest = '\0';
}
3、以下程序段执行后,输出结果为 ( )。
main() {
int a[3][2] = {{1,2},{3,4},{5,6}};
int *p = a[1];
printf("%d", *(p + 1));
}
4、以下程序的功能是交换两个整型变量的值,请填空。( )
void swap(int *x, int *y) {
int t;
t = *x;
________;
*y = t;
}
5、以下程序段执行后,输出结果为 ( )。
main() {
char *p = "C Language";
p += 2;
printf("%c", *p);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
《编程语言基础-C语言》高等教育出版社(第5版)
第八章 指针 章节过关卷(一)(解析版)
考试时间:90分钟 满分:100分
姓名 班级 学号
一、单项选择题(本题共25小题,每题2分,共50分)
1、关于指针变量的定义,以下写法正确的是( )
A. int *p; B. int p*;
C. *int p; D. int *p, q;
答案:A
解析:指针变量的正确定义格式为“基类型 *指针变量名”。A正确;B语法错误;C基类型写错;D中p是指针,q是普通整型变量,不是两个指针。
2、若有定义 int a = 5, *p = &a;,则以下能正确输出变量a值的是( )
A. printf("%d", p); B. printf("%d", *p);
C. printf("%d", &a); D. printf("%d", *a);
答案:B
解析:*p是指针p所指向的变量a的值。A输出p本身(地址);C输出a的地址;D中*a对整型变量取内容非法。
3、以下程序的输出结果是( )
main() {
int a = 10, b = 20, *p, *q;
p = &a;
q = &b;
*p = *q;
printf("%d,%d", a, b);
}
A. 10,20 B. 20,20 C. 10,10 D. 20,10
答案:B
解析:*p = *q 将q指向的b的值(20)赋给p指向的a,因此a变为20,b不变,输出20,20。
4、若有定义 int a[5] = {1,2,3,4,5}, *p = a;,则以下表达式中值为4的是( )
A. *(p + 3) B. p[3] C. *(a + 3) D. 以上都是
答案:D
解析:p指向a[0],p+3指向a[3],值为4;p[3]等价于*(p+3);a[3]值为4。三种方式均正确。
5、下列语句中,将指针p指向数组a的第3个元素的是( )
A. p = a + 2; B. p = &a[2]; C. p = a[2]; D. A和B都正确
答案:D
解析:a+2指向a[2];&a[2]也指向a[2];C中a[2]是元素值,不能赋给指针。A和B均正确。
6、以下程序的输出结果是( )
main() {
int a[3] = {10, 20, 30};
int *p = a;
printf("%d", *(p + 1) + *(p + 2));
}
A. 30 B. 40 C. 50 D. 60
答案:C
解析:*(p+1)=20,*(p+2)=30,和为50。
7、关于指向字符串的指针变量,以下说法正确的是( )
A. char *p = "hello"; 等价于 char s[] = "hello";
B. 不能通过指针修改字符串常量的内容
C. 指针变量p可以指向字符数组
D. 以上都正确
答案:D
解析:A中p指向字符串常量首地址,s是字符数组;B正确,字符串常量不可修改;C正确,指针可以指向字符数组。三者均正确。
8、以下程序的输出结果是( )
main() {
char str[] = "World";
char *p = str;
p += 2;
printf("%s", p);
}
A. World B. orld C. rld D. ld
答案:C
解析:p指向str首地址,p+2指向第3个字符'r',输出从'r'开始的字符串"rld"。
9、以下程序的输出结果是( )
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
main() {
int a = 3, b = 5;
swap(&a, &b);
printf("%d,%d", a, b);
}
A. 3,5 B. 5,3 C. 3,3 D. 5,5
答案:B
解析:通过指针传递地址,swap函数交换了a和b的值,输出5,3。
10、若有定义 int a[5] = {1,2,3,4,5}, *p = a + 2;,则表达式 p[-1] 的值是( )
A. 1 B. 2 C. 3 D. 4
答案:B
解析:p指向a[2]=3,p[-1]等价于*(p-1),指向a[1]=2。
11、以下程序的输出结果是( )
void fun(int *p) {
*p = *p + 10;
}
main() {
int x = 5;
fun(&x);
printf("%d", x);
}
A. 5 B. 10 C. 15 D. 编译错误
答案:C
解析:fun函数通过指针修改实参x的值,x变为5+10=15。
12、以下程序中,通过指针遍历数组并求和,划线处应填( )
int sum(int *arr, int n) {
int s = 0, *p;
for (p = arr; p < arr + n; p++)
________;
return s;
}
A. s += *p B. s += p C. s += arr[p] D. s += p[0]
答案:A
解析:p是移动的指针,*p取得当前指向的元素值,累加到s。
13、以下程序的输出结果是( )
main() {
char s[] = "C Program";
char *p = s;
while (*p != ' ') p++;
printf("%s", p + 1);
}
A. C Program B. Program C. C D. ram
答案:B
解析:p从s开头移动,遇到空格停止,此时p指向空格,p+1指向'P',输出"Program"。
14、若有定义 int a[3][2] = {{1,2},{3,4},{5,6}};,则 *(a[1] + 1) 的值是( )
A. 2 B. 3 C. 4 D. 5
答案:C
解析:a[1]是第2行首地址,a[1]+1指向该行第2个元素,值为4。
15、以下关于指针运算的说法,正确的是( )
A. 两个指针可以相加
B. 两个指针可以相减,结果表示相差的元素个数
C. 指针可以和浮点数相加
D. 指针不能自增自减
答案:B
解析:两个指针可以相减(相同类型),结果是相差的元素个数;指针不能相加;指针只能与整数加减;指针可以自增自减。
16、以下程序的输出结果是( )
main() {
char *p = "abc";
char *q = "abc";
if (p == q)
printf("Equal");
else
printf("Not equal");
}
A. Equal B. Not equal
C. 编译错误 D. 运行时错误
答案:A
解析:字符串常量在内存中通常只有一份拷贝,p和q都指向同一个常量字符串的首地址,因此p==q。
17、以下函数的功能是求字符串的长度,划线处应填( )
int mylen(char *s) {
int n = 0;
while (________) {
n++;
s++;
}
return n;
}
A. *s B. *s != '\0' C. s != '\0' D. A和B都正确
答案:D
解析:*s等价于*s != '\0',当字符不是结束符时循环。A和B都正确。
18、若有定义 int a[5] = {1,2,3,4,5}, *p = a;,则以下表达式中与*(p + 2)不等价的是( )
A. p[2] B. a[2] C. *(a + 2) D. *p[2]
答案:D
解析:*p[2]等价于*(*(p+2)),p是指针,p[2]是int类型,再取*错误。A、B、C均与*(p+2)等价。
19、以下程序的输出结果是( )
void fun(int *p, int n) {
for (int i = 0; i < n; i++)
*(p + i) += i;
}
main() {
int a[3] = {1, 2, 3};
fun(a, 3);
printf("%d", a[1]);
}
A. 1 B. 2 C. 3 D. 4
答案:C
解析:fun函数通过指针修改数组,a[0]=1+0=1,a[1]=2+1=3,a[2]=3+2=5,输出a[1]=3。
20、若有定义 char str[10] = "Hello", *p = str;,则执行p = p + 2;后,printf("%c", *p);输出( )
A. H B. e C. l D. l(第二个l)
答案:C
解析:p指向str[0]='H',p+2指向str[2]='l'(第一个l),输出'l'。
21、以下程序的输出结果是( )
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int *p = a[0];
printf("%d", *(p + 4));
}
A. 3 B. 4 C. 5 D. 6
答案:C
解析:a[0]是第0行首地址,p指向a[0][0],p+4指向第4个元素,在二维数组中按行存储,第4个元素是a[1][1]即5。
22、关于指针作为函数参数的叙述,正确的是( )
A. 可以使被调函数修改主调函数中变量的值
B. 只能传递数组的地址
C. 实参必须是指针变量
D. 形参不能是指针
答案:A
解析:指针作为函数参数可实现地址传递,被调函数可通过指针修改实参的值;B错误,可传递普通变量地址;C错误,实参可以是地址值(如&a);D错误,形参是指针。
23、以下程序的输出结果是( )
main() {
int a = 1, b = 2;
int *p = &a, *q = &b;
*p = *q;
p = q;
printf("%d,%d", a, b);
}
A. 2,2 B. 1,2 C. 2,1 D. 1,1
答案:A
解析:*p = *q使a变为2;p = q使p指向b,不影响a和b的值,最终a=2,b=2,输出2,2。
24、以下程序段中,试图通过指针修改字符串常量,正确的是( )
A. char *p = "abc"; *p = 'A';
B. char s[] = "abc"; char *p = s; *p = 'A';
C. char *p = "abc"; p[0] = 'A';
D. A和C均可
答案:B
解析:字符串常量不可修改,A和C试图修改常量区,行为未定义;B中s是字符数组,可修改。
25、以下程序的输出结果是( )
void fun(int *a, int *b) {
int *t;
t = a;
a = b;
b = t;
}
main() {
int x = 5, y = 7;
fun(&x, &y);
printf("%d,%d", x, y);
}
A. 5,7 B. 7,5 C. 5,5 D. 7,7
答案:A
解析:fun函数交换的是指针形参a和b的值(即指针本身),并不交换它们所指向的内容,因此x和y的值不变,输出5,7。注意:若想交换值,需交换*a和*b。
二、多选题(本题共5小题,每题4分,共20分)
1、以下关于指针的说法,正确的有( )
A. 指针变量中存放的是地址
B. 指针变量必须先赋值才能使用
C. 不同类型的指针变量长度可能不同
D. 可以给指针变量赋NULL
答案:ABD
解析:指针变量存放地址;使用前必须赋值(指向合法地址),否则是野指针;不同基类型的指针变量长度相同(都是地址,通常4或8字节);可以赋NULL。
2、以下选项中,能够将指针p指向数组a的第2个元素的有( )
A. p = a + 1;
B. p = &a[1];
C. p = a[1];
D. p = a; p++;
答案:ABD
解析:A中a+1指向第二个元素;B中&a[1]取第二个元素的地址;D中先指向首地址,再自增指向第二个元素;C中a[1]是元素值,不是地址。
3、以下关于指针与数组的叙述,正确的有( )
A. 数组名是地址常量,不能被赋值
B. 指针变量可以指向数组元素
C. 通过指针可以像数组一样使用下标
D. *(p + i)等价于p[i]
答案:ABCD
解析:数组名是常量,不能做左值;指针可以指向数组元素;指针可以通过下标访问元素;*(p+i)与p[i]完全等价。
4、以下关于指针作为函数参数的叙述,正确的有( )
A. 可以实现在函数内部修改主调函数的变量值
B. 形参可以声明为指针类型
C. 实参可以是变量的地址
D. 实参可以是数组名
答案:ABCD
解析:指针参数可实现地址传递;形参为指针;实参可以是&变量或数组名(数组名即地址)。所有选项均正确。
5、以下关于指向字符串的指针的说法,正确的有( )
A. char *p = "hello"; 可以用 p[0] = 'H' 修改
B. char s[] = "hello"; char *p = s; 可以通过p修改数组中的字符
C. char *p = "hello"; 和 char s[] = "hello"; 的内存存储方式不同
D. 可以通过指针移动来遍历字符串
答案:BCD
解析:A错误,字符串常量不可修改;B正确,s是字符数组,可修改;C正确,p指向常量区,s在栈区;D正确。
三、判断题(本题共10小题,每题2分,共20分)
1、指针变量中存放的是整型数值,可以直接参与算术运算。( )
答案:×
解析:指针变量存放地址,指针可以参与加减整数运算,但不能进行乘除等算术运算。
2、NULL是一个宏定义,表示空指针,值为0。( )
答案:√
解析:NULL通常定义为((void*)0)或0,表示不指向任何有效内存。
3、两个不同类型的指针可以直接相互赋值。( )
答案:×
解析:不同类型指针之间不能直接赋值,需通过强制类型转换,否则编译警告或错误。
4、数组名是一个指针变量,可以指向其他数组。( )
答案:×
解析:数组名是地址常量,不是变量,不能赋值。
5、char *p = "abc"; 中的字符串"abc"存储在常量区,不可修改。( )
答案:√
解析:字符串常量存储在只读存储区,试图修改会导致未定义行为。
6、指针变量只能进行加法和减法运算,不能进行乘除运算。( )
答案:√
解析:指针加减整数有定义,乘除无意义。
7、两个同类型的指针相减的结果是一个整数值,表示它们之间相差的元素个数。( )
答案:√
解析:指针相减得到偏移量,类型为ptrdiff_t。
8、指向整型变量的指针和指向字符型变量的指针,其长度相同。( )
答案:√
解析:所有指针变量长度相同(与机器字长有关,通常4或8字节)。
9、可以通过指针变量直接修改字符串常量中的字符。( )
答案:×
解析:字符串常量不可修改,试图修改会导致运行时错误或未定义行为。
10、在函数参数中,int a[] 和 int *a 是完全等价的。( )
答案:√
解析:作为函数形参时,数组名退化为指针,两者等价。
四、填空题(本题共5小题,每题2分,共10分)
1、以下程序段中,指针p指向数组a的首地址,请填空,使程序输出数组所有元素的值。( )
int a[5] = {1,2,3,4,5};
int *p;
for (p = a; p < a + 5; p++)
printf("%d ", ________);
答案:*p
解析:通过指针移动,*p获取当前指向的元素值。
2、以下程序段的功能是通过指针实现字符串复制,请填空。( )
void mycpy(char *dest, char *src) {
while (________) {
*dest = *src;
dest++;
src++;
}
*dest = '\0';
}
答案:*src != '\0' 或 *src
解析:循环条件为源字符串未结束,逐个字符复制。
3、以下程序段执行后,输出结果为 ( )。
main() {
int a[3][2] = {{1,2},{3,4},{5,6}};
int *p = a[1];
printf("%d", *(p + 1));
}
答案:4
解析:a[1]是第2行首地址,指向3,p+1指向该行第2个元素4,输出4。
4、以下程序的功能是交换两个整型变量的值,请填空。( )
void swap(int *x, int *y) {
int t;
t = *x;
________;
*y = t;
}
答案:*x = *y
解析:标准交换:先保存*x,再将*y赋给*x,最后将t赋给*y。
5、以下程序段执行后,输出结果为 ( )。
main() {
char *p = "C Language";
p += 2;
printf("%c", *p);
}
答案:L
解析:p指向字符串开头,p+2指向第3个字符'L',输出'L'。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$