第8章 第3节:指向数组的指针变量(练习)-《编程语言基础—C语言》(高教版第5版)同步精品课堂量

2025-12-29
| 2份
| 19页
| 45人阅读
| 1人下载

内容正文:

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]); } } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

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