内容正文:
8.3节:指向数组的指针变量
一、单项选择题
1.定义int arr[5] = {1,2,3,4,5}; int *p = arr;,执行p += 2;后,*p的值是( )
A.1
B.2
C.3
D.4
2.定义int *arr[2]; int x=10, y=20; arr[0]=&x; arr[1]=&y;,则arr[1]-arr[0]的值是()
A. 1
B. 4
C. 2
D. 8
3.若有定义int a[5] = {1,2,3,4,5}, *p = a;,则*(p+2)的值是()
A. 1
B. 2
C. 3
D. 4
4.以下关于指针与数组关系的说法正确的是()
A. 数组名是一个指针变量
B. 数组名是数组首元素的地址
C. 数组名可以重新赋值
D. 指针变量可以存储整个数组
5.若有int a[3] = {10,20,30}, *p = a;,则p[1]的值是()
A. 10
B. 20
C. 30
D. p的地址
6.以下程序段的输出结果是()
#include <stdio.h>
main() {
int a[3] = {5,10,15}, *p = a;
printf("%d", *p + 2);
}
A. 5
B. 7
C. 10
D. 15
7.若有int a[4] = {1,3,5,7}, *p = a + 2;,则*p的值是()
A. 1
B. 3
C. 5
D. 7
8.以下程序段的输出结果是()
#include <stdio.h>
main() {
int a[3] = {8,16,24}, *p = a;
printf("%d", *(p + 1));
}
A. 8
B. 16
C. 24
D. p的地址
9.若有int a[3][2] = {{1,2},{3,4},{5,6}}, *p = a[0];,则*(p + 3)的值是()
A. 1
B. 3
C. 4
D. 5
10.以下程序段的输出结果是()
#include <stdio.h>
main() {
int a[2][2] = {{10,20},{30,40}}, *p = a[0];
printf("%d", *(p + 3));
}
A. 10
B. 20
C. 30
D. 40
二、程序运行结果题
11.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int a[5] = {2,4,6,8,10}, *p = a;
printf("%d %d", *p, *(p + 3));
}
12.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}}, *p = a[0];
printf("%d %d", p[3], p[5]);
}
13.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int a[4] = {10,20,30,40}, *p = a;
*p = *(p + 2);
*(p + 2) = 50;
printf("%d %d", a[0], a[2]);
}
14.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int arr[5] = {1,2,3,4,5};
int *p = arr+4;
int sum = 0;
while (p >= arr) {
sum += *p;
p--;
}
printf("%d", sum);
}
15.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int a[2][2] = {{1,2},{3,4}}, *p = a[0];
printf("%d %d", *(p + 1), *(p + 3));
}
16.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int a[3] = {5,10,15}, *p = a;
*(p + 1) = *p + 5;
printf("%d", a[1]);
}
17.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int a[4] = {1,3,5,7}, *p = a + 1;
*p = *(p - 1) + *(p + 1);
printf("%d", a[1]);
}
18.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int arr[5] = {5,10,15,20,25};
int *p = arr;
int count = 0;
while (p < arr+5) {
if (*p % 10 == 0) count++;
p++;
}
printf("%d", count);
}
19.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int *arr[3];
int x=10, y=20, z=30;
arr[0]=&x; arr[1]=&y; arr[2]=&z;
**arr += 5;
*arr[2] -= 5;
printf("%d %d", x, z);
}
20.执行以下程序的输出结果是()
#include <stdio.h>
main() {
int arr[5] = {1,3,5,7,9},i;
int *p1 = arr, *p2 = arr+4;
while (p1 < p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2--;
}
for(i=0; i<5; i++)
printf("%d ", arr[i]);
}
三、编程题
1.通过指针实现一维数组(长度 5)的元素去重(假设数组已排序),输出去重后的数组及长度。
2.通过指针数组存储 5 个整数的地址,找出其中的最大值,输出最大值及对应的原数组下标。
3.通过指针将一维数组(长度 6)的元素按奇偶分类,奇数存到原数组前半部分,偶数存到后半部分,输出分类后的数组。
4.通过指针数组实现 5 个字符串的字典序排序(假设字符串已存储在字符数组中),输出排序后的字符串。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
8.3节:指向数组的指针变量
一、单项选择题
1.定义int arr[5] = {1,2,3,4,5}; int *p = arr;,执行p += 2;后,*p的值是( )
A.1
B.2
C.3
D.4
【答案】C p初始指向arr[0],p +=2指向arr[2],*p取 3。
2.定义int *arr[2]; int x=10, y=20; arr[0]=&x; arr[1]=&y;,则arr[1]-arr[0]的值是( )
A. 1
B. 4
C. 2
D. 8
【答案】A 指针数组的元素是指针,arr[1]-arr[0]是元素个数差(1)。
3.若有定义int a[5] = {1,2,3,4,5}, *p = a;,则*(p+2)的值是( )
A. 1
B. 2
C. 3
D. 4
【答案】C p指向数组首元素,p+2指向第3个元素,*(p+2)就是3。
4.以下关于指针与数组关系的说法正确的是( )
A. 数组名是一个指针变量
B. 数组名是数组首元素的地址
C. 数组名可以重新赋值
D. 指针变量可以存储整个数组
【答案】B 数组名是数组首元素的地址,是一个地址常量,不能重新赋值。
5.若有int a[3] = {10,20,30}, *p = a;,则p[1]的值是( )
A. 10
B. 20
C. 30
D. p的地址
【答案】B p指向数组首元素,p[1]等价于*(p+1),即第二个元素20。
6.以下程序段的输出结果是( )
#include <stdio.h>
main() {
int a[3] = {5,10,15}, *p = a;
printf("%d", *p + 2);
}
A. 5
B. 7
C. 10
D. 15
【答案】B *p是5,加2后是7。
7.若有int a[4] = {1,3,5,7}, *p = a + 2;,则*p的值是( )
A. 1
B. 3
C. 5
D. 7
【答案】C p指向a[2],即5。
8.以下程序段的输出结果是( )
#include <stdio.h>
main() {
int a[3] = {8,16,24}, *p = a;
printf("%d", *(p + 1));
}
A. 8
B. 16
C. 24
D. p的地址
【答案】B p+1指向a[1],*(p+1)就是16。
9.若有int a[3][2] = {{1,2},{3,4},{5,6}}, *p = a[0];,则*(p + 3)的值是( )
A. 1
B. 3
C. 4
D. 5
【答案】C p指向a[0][0],p+3指向a[1][1],即4。
10.以下程序段的输出结果是( )
#include <stdio.h>
main() {
int a[2][2] = {{10,20},{30,40}}, *p = a[0];
printf("%d", *(p + 3));
}
A. 10
B. 20
C. 30
D. 40
【答案】D p指向a[0][0],p+3指向a[1][1],即40。
二、程序运行结果题
11.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int a[5] = {2,4,6,8,10}, *p = a;
printf("%d %d", *p, *(p + 3));
}
【答案】2 8
12.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}}, *p = a[0];
printf("%d %d", p[3], p[5]);
}
【答案】4 6
13.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int a[4] = {10,20,30,40}, *p = a;
*p = *(p + 2);
*(p + 2) = 50;
printf("%d %d", a[0], a[2]);
}
【答案】30 50
14.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int arr[5] = {1,2,3,4,5};
int *p = arr+4;
int sum = 0;
while (p >= arr) {
sum += *p;
p--;
}
printf("%d", sum);
}
【答案】15
15.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int a[2][2] = {{1,2},{3,4}}, *p = a[0];
printf("%d %d", *(p + 1), *(p + 3));
}
【答案】2 4
16.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int a[3] = {5,10,15}, *p = a;
*(p + 1) = *p + 5;
printf("%d", a[1]);
}
【答案】10
17.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int a[4] = {1,3,5,7}, *p = a + 1;
*p = *(p - 1) + *(p + 1);
printf("%d", a[1]);
}
【答案】6
18.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int arr[5] = {5,10,15,20,25};
int *p = arr;
int count = 0;
while (p < arr+5) {
if (*p % 10 == 0) count++;
p++;
}
printf("%d", count);
}
【答案】2
19.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int *arr[3];
int x=10, y=20, z=30;
arr[0]=&x; arr[1]=&y; arr[2]=&z;
**arr += 5;
*arr[2] -= 5;
printf("%d %d", x, z);
}
【答案】15 25
20.执行以下程序的输出结果是( )
#include <stdio.h>
main() {
int arr[5] = {1,3,5,7,9},i;
int *p1 = arr, *p2 = arr+4;
while (p1 < p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2--;
}
for(i=0; i<5; i++)
printf("%d ", arr[i]);
}
【答案】9 7 5 3 1
三、编程题
1.通过指针实现一维数组(长度 5)的元素去重(假设数组已排序),输出去重后的数组及长度。
【答案】
#include <stdio.h>
main() {
int arr[5] = {1,2,2,3,3};
int *p = arr, *q = arr;
int len = 1,i;
// 去重逻辑
while (p < arr+5) {
if (*p != *q) {
q++;
*q = *p;
len++;
}
p++;
}
// 输出结果
printf("去重后数组:");
for(i=0; i<len; i++) {
printf("%d ", arr[i]);
}
printf("
长度:%d", len);
}
2.通过指针数组存储 5 个整数的地址,找出其中的最大值,输出最大值及对应的原数组下标。
【答案】
#include <stdio.h>
int main() {
int arr[5] = {10,25,8,30,15};
int *ptr_arr[5],*max_p,i,idx;
// 初始化指针数组
for(i=0; i<5; i++) {
ptr_arr[i] = &arr[i];
}
// 找最大值
max_p = ptr_arr[0];
idx = 0;
for(i=1; i<5; i++) {
if (*ptr_arr[i] > *max_p) {
max_p = ptr_arr[i];
idx = i;
}
}
printf("最大值:%d,下标:%d", *max_p, idx);
}
3.通过指针将一维数组(长度 6)的元素按奇偶分类,奇数存到原数组前半部分,偶数存到后半部分,输出分类后的数组。
【答案】
#include <stdio.h>
int main() {
int arr[6] = {1,2,3,4,5,6};
int *p = arr, *q = arr+5,i;
while (p < q) {
// 找到前半部分的偶数
while (p < q && *p % 2 != 0) p++;
// 找到后半部分的奇数
while (p < q && *q % 2 == 0) q--;
// 交换
if (p < q) {
int temp = *p;
*p = *q;
*q = temp;
p++;
q--;
}
}
// 输出结果
printf("分类后数组:");
for(i=0; i<6; i++) {
printf("%d ", arr[i]);
}
}
4.通过指针数组实现 5 个字符串的字典序排序(假设字符串已存储在字符数组中),输出排序后的字符串。
【答案】
#include <stdio.h>
#include <string.h>
int main() {
int i,j;
char str[5][20] = {"banana", "apple", "cherry", "date", "elderberry"};
char *ptr_arr[5];
// 初始化指针数组
for(i=0; i<5; i++) {
ptr_arr[i] = str[i];
}
// 冒泡排序
for(i=0; i<4; i++) {
for(j=0; j<4-i; j++) {
if (strcmp(ptr_arr[j], ptr_arr[j+1]) > 0) {
char *temp = ptr_arr[j];
ptr_arr[j] = ptr_arr[j+1];
ptr_arr[j+1] = temp;
}
}
}
// 输出结果
printf("排序后:");
for(i=0; i<5; i++) {
printf("%s ", ptr_arr[i]);
}
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$