内容正文:
专题九 指针
一:单选题
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.523 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.523 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;
}
学科网(北京)股份有限公司
$$