第八章 指针《编程语言基础-C语言》(高教版第5版)章节过关卷(二)

2026-05-08
| 2份
| 17页
| 16人阅读
| 0人下载

资源信息

学段 中职
学科 职教专业课
课程 C语言程序设计
教材版本 C语言程序设计高教版(第五版)全一册
年级 高一
章节 第8章 指针
类型 作业-单元卷
知识点 指针
使用场景 同步教学-单元练习
学年 2026-2027
地区(省份) 全国
地区(市) -
地区(区县) -
文件格式 ZIP
文件大小 271 KB
发布时间 2026-05-08
更新时间 2026-05-08
作者 xkw_063129603
品牌系列 学易金卷·阶段检测模拟卷
审核时间 2026-05-08
下载链接 https://m.zxxk.com/soft/57744690.html
价格 3.00储值(1储值=1元)
来源 学科网

内容正文:

《编程语言基础-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"。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

第八章 指针《编程语言基础-C语言》(高教版第5版)章节过关卷(二)
1
第八章 指针《编程语言基础-C语言》(高教版第5版)章节过关卷(二)
2
第八章 指针《编程语言基础-C语言》(高教版第5版)章节过关卷(二)
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。