专题九 指针(练习)-《编程语言基础—C语言》(高教版第五版)高考备考讲练测(山东省)

2024-08-02
| 2份
| 11页
| 178人阅读
| 3人下载

内容正文:

专题九 指针 一:单选题 1:若有以下定义则对a数组元素的正确引用是( )。 int a[5],*p=a; A.*&a[5] B.a+2 C.*(p+5) D.*(a+2) 2:以下程序的输出结果是( )。 main() { int a[] = {2, 4, 6, 8, 10}, y = 1, x, *p; p = &a[1]; for (x = 0; x < 3; x++) y += *(p + x); printf("%d ", y); } A.17 B.19 C.16 D.20 3:若有以下定义和语句: int s[4][5], (*ps)[5]; ps = s; 则对s数组元素的正确引用形式是( )。 A.ps+1 B.*(ps+3) C.ps[0][2] D.*(ps+1)+3 4:有如下程序段: int *p, a = 10, b = 3; p = &a; a = *p + b; 执行该程序段后a的值为( )。 A.11 B.12 C.13 D.14 5:以下程序的输出结果是( )。 void prtv(int *x) { printf("%d ", ++*x); } main() { int a = 25; prtv(&a); } A.23 B.24 C.25 D.26 6:以下程序的输出结果是( )。 int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = a; printf("%d ", *(p + 2)); A.3 B.4 C.1 D.2 7:执行语句后 int a = 5, b = 10, c; int *p1 = &a, *p2 = &b; 下面不正确的赋值语句是( )。 A.*p2=b; B.p1=a; C.p2=p1; D.c=*p1*(*p2); 8:以下程序的输出结果是( )。 #include <stdio.h> void sub(int x, int y, int *z) { *z = y - x; } int main() { int a, b, c; sub(10, 5, &a); sub(7, a, &b); sub(a, b, &c); printf("%d,%d,%d ", a, b, c); return 0; } A.523 B.-5-12-7 C.-5-12-17 D.5-2-7 二:分析题 1.若p指向存储单元a[0](假设a[0]的值为5),则以下语句的输出结果是______________。 for (i = 0; i < 5; i++) printf("%d", *p + i); printf(" "); 2:以下程序的运行结果是__________。 #include <stdio.h> int ast(int x, int y, int *cp, int *dp) { *cp = x * y; *dp = x % y; } main() { int a, b, c, d; a = 2; b = 3; ast(a, b, &c, &d); printf("%d,%d ", c, d); } 3.执行该程序后a的值为________b的值为________。 main() { int a, b, k = 4, m = 6, *p1 = &k, *p2 = &m; a = p1 == &m; b = (*p1) / (*p2) + 7; printf("a=%d ", a); printf("b=%d ", b); } 三:编程题 1:利用指针编程:求二维数组元素的最大值 2:利用指针编程:用一个函数求10个学生成绩的最高分,最低分和平均成绩 学科网(北京)股份有限公司 $$ 专题九 指针 一:单选题 1:若有以下定义则对a数组元素的正确引用是( )。 int a[5],*p=a; A.*&a[5] B.a+2 C.*(p+5) D.*(a+2) 【答案】D 【解析】a+2 表示数组的第3个元素的地址,而 * 用于解引用,所以 *(a+2) 就是对数组第三个元素的正确引用。 2:以下程序的输出结果是( )。 main() { int a[] = {2, 4, 6, 8, 10}, y = 1, x, *p; p = &a[1]; for (x = 0; x < 3; x++) y += *(p + x); printf("%d ", y); } A.17 B.19 C.16 D.20 【答案】B 【解析】第一次循环:x = 0,p + x 指向 a[1],即 4,y 变为 1 + 4 = 5。第二次循环:x = 1,p + x 指向 a[2],即 6,y 变为 5 + 6 = 11。第三次循环:x = 2,p + x 指向 a[3],即 8,y 变为 11 + 8 = 19。 3:若有以下定义和语句: int s[4][5], (*ps)[5]; ps = s; 则对s数组元素的正确引用形式是( )。 A.ps+1 B.*(ps+3) C.ps[0][2] D.*(ps+1)+3 【答案】C 【解析】int s[4][5] 定义了一个名为 s 的二维数组,具有4行5列,总共可以存储20个整数。(int*)ps[5] 定义了一个指针 ps,它可以指向一个包含5个整数的数组,即指向一个二维数组的一行。由于 ps 是指向 s 的第一行的指针,ps[0] 就是第一行的数组,ps[0][2] 就是第一行的第三个元素(索引从0开始)。这是一个正确的数组元素引用。 4:有如下程序段: int *p, a = 10, b = 3; p = &a; a = *p + b; 执行该程序段后a的值为( )。 A.11 B.12 C.13 D.14 【答案】C 【解析】int *p, a = 10, b = 3; 定义了一个整型指针 p,以及两个整型变量 a 和 b。变量 a 被初始化为10,变量 b 被初始化为3。p = &a; 将指针 p 指向变量 a 的地址。a = *p + b; 这行代码做了两件事:*p 是对指针 p 解引用,即获取 p 指向的变量 a 的值,此时 a 的值为10。然后,将 *p 的值(即10)与变量 b 的值(即3)相加,得到13。 最后,将这个结果13赋值给变量 a。 5:以下程序的输出结果是( )。 void prtv(int *x) { printf("%d ", ++*x); } main() { int a = 25; prtv(&a); } A.23 B.24 C.25 D.26 【答案】D 【解析】*x 解引用指针 x,得到 a 的值,即25。++ 是一个前置递增运算符,它会将 *x 的值增加1,然后返回增加后的值。因此,++*x 将 a 的值从25增加到26。然后,printf 打印出 ++*x 的结果,即26。 6:以下程序的输出结果是( )。 int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = a; printf("%d ", *(p + 2)); A.3 B.4 C.1 D.2 【答案】A 【解析】a 是一个整型数组,包含了10个元素,初始化为 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。p 是一个指向整型的指针,它被初始化为指向数组 a 的第一个元素。*(p + 2) 表示 p 指针向前移动2个位置,然后解引用它。在C语言中,数组索引是从0开始的,所以 p + 2 实际上是指向数组的第三个元素。数组 a 的第三个元素是 3。因此,printf("%d ", *(p + 2)); 将打印出数组 a 的第三个元素的值,即 3。 7:执行语句后 int a = 5, b = 10, c; int *p1 = &a, *p2 = &b; 下面不正确的赋值语句是( )。 A.*p2=b; B.p1=a; C.p2=p1; D.c=*p1*(*p2); 【答案】B 【解析】p1 是一个指针,应该被赋值为另一个变量的地址,而不是变量的值。正确的赋值应该是 p1 = &a;。 8:以下程序的输出结果是( )。 #include <stdio.h> void sub(int x, int y, int *z) { *z = y - x; } int main() { int a, b, c; sub(10, 5, &a); sub(7, a, &b); sub(a, b, &c); printf("%d,%d,%d ", a, b, c); return 0; } A.523 B.-5-12-7 C.-5-12-17 D.5-2-7 【答案】B 【解析】定义了三个整型变量 a, b, c。调用 sub(10, 5, &a);,这里 x 是10,y 是5,z 是 a 的地址。sub 函数将 y - x 的结果,即 5 - 10 的结果 -5 赋值给 a。接下来调用 sub(7, a, &b);,此时 a 的值已经是 -5,所以 x 是7,y 是 -5,z 是 b 的地址。sub 函数将 y - x 的结果,即 -5 - 7 的结果 -12 赋值给 b。最后调用 sub(a, b, &c);,此时 a 的值是 -5,b 的值是 -12,z 是 c 的地址。sub 函数将 y - x 的结果,即 -12 - (-5) 的结果 -7 赋值给 c。最终,变量 a, b, c 的值分别为 -5, -12, -7。 二:分析题 1.若p指向存储单元a[0](假设a[0]的值为5),则以下语句的输出结果是______________。 for (i = 0; i < 5; i++) printf("%d", *p + i); printf(" "); 【答案】5 6 7 8 9 2:以下程序的运行结果是__________。 #include <stdio.h> int ast(int x, int y, int *cp, int *dp) { *cp = x * y; *dp = x % y; } main() { int a, b, c, d; a = 2; b = 3; ast(a, b, &c, &d); printf("%d,%d ", c, d); } 【答案】6,2 3.执行该程序后a的值为________b的值为________。 main() { int a, b, k = 4, m = 6, *p1 = &k, *p2 = &m; a = p1 == &m; b = (*p1) / (*p2) + 7; printf("a=%d ", a); printf("b=%d ", b); } 【答案】0 7 三:编程题 1:利用指针编程:求二维数组元素的最大值 【答案】 #include <stdio.h> #include <limits.h> // 引入此头文件以使用INT_MIN int main() { int rows = 3; // 假设有3行 int cols = 4; // 假设有4列 int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int *ptr, max = INT_MIN, i, j; // 使用指针遍历二维数组 for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { ptr = &arr[i][j]; // 获取当前元素的地址 if (*ptr > max) { max = *ptr; // 更新最大值 } } } printf("The maximum value in the 2D array is: %d ", max); return 0; } 2:利用指针编程:用一个函数求10个学生成绩的最高分,最低分和平均成绩 【答案】 #include <stdio.h> // 函数声明 void find_scores(int scores[], int n, int *highest, int *lowest, double *average); int main() { int scores[] = {85, 92, 76, 68, 81, 90, 79, 95, 88, 72}; // 10个学生的成绩 int highest, lowest; double average; // 调用函数求最高分、最低分和平均成绩 find_scores(scores, 10, &highest, &lowest, &average); // 输出结果 printf("Highest score: %d ", highest); printf("Lowest score: %d ", lowest); printf("Average score: %.2f ", average); return 0; } // 函数定义 void find_scores(int scores[], int n, int *highest, int *lowest, double *average) { int i; *highest = scores[0]; *lowest = scores[0]; double sum = 0.0; // 遍历数组求和,并更新最高分和最低分 for (i = 0; i < n; i++) { if (scores[i] > *highest) *highest = scores[i]; if (scores[i] < *lowest) *lowest = scores[i]; sum += scores[i]; } // 计算平均成绩 *average = sum / n; } 学科网(北京)股份有限公司 $$

资源预览图

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