#4440. 指针课后练习
指针课后练习
指针课后作业
一.选择题
1.下列程序的输出结果是______。
#include <stdio.h>
#include <string.h>
int main() {
char *p1,*p2, s[10] = "12345";
p1 = "abcde";
p2 = "ABCDE";
strcpy(s + 2, p1 + 3);
strcat(s, p2 + 2);
printf("%s", s);
return 0;
}
{{ select(1) }}
- 12deCDE
- 12abcAB
- cdABC45
- abcBDE
- 以下程序运行之后的输出结果是______。
#include <iostream>
int main() {
int *p,*p1,*p2, a = 3, b = 7;
p1 = &a;
p2 = &b;
if (a < b) {
p = p1;
p1 = p2;
p2 = p;
}
printf("%d,%d ", *p1, *p2);
printf("%d,%d", a, b);
return 0;
}
{{ select(2) }}
- 3,7 7,3
- 7,3 3,7
- 7,3 7,3
- 3,7 3,7
- 以下函数的功能是______。
void fun(int *p1, int *p2) {
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
{{ select(3) }}
- 正确,但没有交换
*p1和*p2的值。 - 使用了空指针,可能造成系统故障。
- 能成功交换
*p1和*p2的值。 - 能成功交换
*p1和*p2的地址。
- 有以下程序:
#include <stdio.h>
int main() {
int x[8] = {8, 7, 6, 5, 0, 0},*s;
s = x + 3;
printf("%d\n", s[2]);
return 0;
}
执行后输出结果是______。
{{ select(4) }}
- 随机值
- 0
- 5
- 6
- 以下程序的输出结果是______。
#include <stdio.h>
#include <string.h>
int main() {
char b1[8] = "abcdefg", b2[8],*pb = b1 + 3;
while (--pb >= b1) strcpy(b2, pb);
printf("%d\n", strlen(b2));
return 0;
}
{{ select(5) }}
- 8
- 3
- 1
- 7
- 若有以下说明:
int w[3][4]={{0,1},{2,4},{5,8}};
int (*p)[4]=w;
则数值为4的表达式是______。
{{ select(6) }}
*w[1]+1p++,*(p+1)w[2][2]p[1][1]
- 以下程序的输出结果是______。
#include <stdio.h>
int i;
int fun(int a, int *b);
int main() {
int i = 1, j = 2;
fun(fun(i, &j), &j);
return 0;
}
int fun(int a, int *b) {
static int m = 2;
i += m + a;
m = ++(*b);
printf("%d,%d\n", i, m);
return m;
}
{{ select(7) }}
- 3,3 9,4
- 3,3 6,3
- 3,3 9,3
- 3,3 6,4
- 若有语句:
int a=4, *p=&a;,下面均代表地址的一组选项是______。
{{ select(8) }}
a,p,&*a*&a,&a,*p&a,p,&*p*&p,*p,&a
- 以下程序的输出结果为______。
#include <stdio.h>
int main() {
char s[] = "123",*p;
p = s;
printf("%c%c%c\n", *p++, *p++, *p++);
return 0;
}
{{ select(9) }}
- 123
- 231
- 321
- 312
- 以下程序的输出结果是______。
#include <stdio.h>
int main() {
static char s1[] = "programe", s2[] = "language";
char *p1,*p2;
int i;
p1 = s1;
p2 = s2;
for (i = 0; i < 8; i++)
if (*(p1 + i) == *(p2 + i))
printf("%c", *(p1 + i));
return 0;
}
{{ select(10) }}
- gae
- ga
- pro
- lang
- 以下定义中与
int *p[4]等价的是______。
{{ select(11) }}
int p[4]int *pint *(p[4])int (*p)[4]
- 以下程序的运行结果是______。
#include <stdio.h>
int main() {
char *s = "xcbc3abcd";
int a, b, c, d;
a = b = c = d = 0;
for (; *s; s++)
switch (*s) {
case 'c':
c++;
case 'b':
b++;
default :
d++;
break;
case 'a':
a++;
}
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
return 0;
}
{{ select(12) }}
- a=1,b=5,c=3,d=8
- a=1,b=2,c=3,d=3
- a=9,b=5,c=3,d=8
- a=0,b=2,c=3,d=3
- 设
char *aa[2]={"abcd","ABCD"}; 则以下说法中正确的是______。
{{ select(13) }}
- aa数组元素的值分别是"abcd"和"ABCD"。
- aa是指针变量,它指向含有两个数组元素的字符型一维数组。
- aa数组的两个元素分别存放的是含有4个字符的一维字符数组首地址。
- aa数组的两个元素中各自存放了字符'a'和'A'的地址。
- 已知函数定义如下:
int fun (char *p1) {
char *p2 = p1;
while (*p2 != '\0')
p2++;
return (p2 - p1);
}
在主函数中用语句printf("%d",fun("hello world!"));调用上述函数,则输出结果为______。
{{ select(14) }}
- 13
- 12
- 11
- 10
- 若有以下定义:
int a[]={1,2,3,4,5,6,7,8,9,10}, *p=a;表达式的值为3的是______。
{{ select(15) }}
p+=2,*(p++)p+=2,*++pp+=3,*p++p+=2,++*p
- 以下程序段执行完后,a的值为______。
static int s[2][4] = {0, 1, 2, 3, 4, 5, 6, 7};
int a,*p;
p = &s[0][1];
a = (*p) * (*p + 3) * (*p + 5);
{{ select(16) }}
- 24
- 15
- 28
- 不确定
17.设x为一数字字符,则其所对应的十进制数值为______。
{{ select(17) }}
xx-‘0’*x&x
18.以下程序中函数scmp的功能是返回形参指针s1和s2所指字符串中较小字符串的首地址,若运行时依次输入:abcd、abba和abc三个字符串,则输出结果为______。
#include <iostream>
#include <string.h>
using namespace std;
char *scmp(char *s1, char *s2) {
if (strcmp(s1, s2) < 0)
return (s1);
else return (s2);
}
int main() {
int i;
char string[20], str[3][20];
for (i = 0; i < 3; i++) fgets(str[i], sizeof(str[i]), stdin);
strcpy(string, scmp(str[0], str[1]));
strcpy(string, scmp(string, str[2]));
printf("%s\n", string);
return 0;
}
{{ select(18) }}
- abcd
- abba
- abc
- abca
- 以下程序的输出结果是______。
#include <stdio.h>
int main() {
int *p1,*p2,*p, a = 7, b = 9;
p1 = &a;
p2 = &b;
if (a < b) {
p = p1;
p1 = p2;
p2 = p;
}
printf("%d,%d ", *p1, *p2);
printf("%d,%d ", a, b);
return 0;
}
{{ select(19) }}
- 9,7 7,9
- 7,9 7,9
- 7,9 9,7
- 9,7 9,7
- 有以下程序:
#include <stdio.h>
int *f(int *x, int *y) {
if (*x < *y) return x;
else return y;
}
int main() {
int a = 7, b = 8,*p,*q, *r;
p = &a;
q = &b;
r = f(p, q);
printf("%d,%d,%d\n", *p, *q, *r);
return 0;
}
执行后输出结果是______。
{{ select(20) }}
- 7,8,8
- 7,8,7
- 8,7,7
- 8,7,8
- 已知有以下的说明,那么执行语句
a=p+2;后,a[0]的值等于多少______。
float a[3]={1.2,45.6,-23.0};
float *p=a;
{{ select(21) }}
- 1.2
- 45.6
- -23.0
- 语句有错
- 如下程序的执行结果是______。
#include <stdio.h>
int main() {
int p1, m1, n1, dv, df;
char *p = "a+b-c+d/e", c;
p1 = m1 = n1 = dv = df = 0;
while ((c = *p++) != '\0') {
switch (c) {
case '+':
p1++;
break;
case '-':
m1++;
break;
case '*':
n1++;
break;
case '/':
dv++;
break;
default:
df++;
}
}
printf("%d,%d,%d,%d\n", p1, m1, dv, df);
return 0;
}
{{ select(22) }}
- 2,1,0,1
- 2,1,0,5
- 2,1,1,5
- 2,1,1,2
- 有以下程序:
#include <stdio.h>
int main() {
int a[3][3],*p, i;
p = &a[0][0];
for (i = 0; i < 9; i++) p[i] = i + 1;
printf("%d \n", a[1][2]);
return 0;
}
程序运行后的输出结果是______。
{{ select(23) }}
- 3
- 6
- 9
- 2
- 如下程序的执行结果是______。
#include <stdio.h>
int main() {
int a[3][3] = {{2}, {4}, {6}}, i,*p = &a[0][0];
for (i = 0; i < 2; i++) {
if (i == 0) a[i][i + 1] = *p + 1;
else ++p;
printf("%d", *p);
}
printf("\n");
return 0;
}
{{ select(24) }}
- 23
- 26
- 33
- 36
- 已知
char s[]="789",*p;则执行下列语句后的输出是______。
p=s;
printf("%c",*(p+2));
{{ select(25) }}
- 字符'8'
- 字符'9'
- 字符'8' 的地址
- 字符'9'的地址
二、判断题
1.以下程序:
#include <stdio.h>
int fun(int array[], int n) {
int m = 0, i;
for (i = 0; i < n; i++) {
m += *array;
array++;
}
return m;
}
int main() {
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("fun=%d\n", fun(a, 10));
return 0;
}
其输出结果是1~10的总和。
{{ select(26) }}
- 正确
- 错误
2.有如下定义:
int a[]={1,3,5,7,9}, i, *p ;
则语句:
for(i=0; i<5; i++) printf("a[%d]=%d\t",i,a[i]);
与语句:
for(p=a, i=0; i<5; i++) printf("a[%d]=%d\t",i,p[i]);
等价的。
{{ select(27) }}
- 正确
- 错误
3.以下程序:
#include <stdio.h>
int main() {
int i = 10,*p;
p = &i;
*p = 5;
printf("%d\n", i);
return 0;
}
输出结果为10。
{{ select(28) }}
- 正确
- 错误
4.在定义:int *fun();中,标识符fun()是一个用于指向函数的指针变量。
{{ select(29) }}
- 正确
- 错误
5.可通过int *i=NULL; scanf("%d",i); 正确进行整数赋值。
{{ select(30) }}
- 正确
- 错误
6.指针加1表示每次向下移动1个字节。
{{ select(31) }}
- 正确
- 错误
7.相同类型的指针可以进行减法运算。
{{ select(32) }}
- 正确
- 错误
8.函数fun(int *p){ return *p; }的返回值是不确定的值。
{{ select(33) }}
- 正确
- 错误
9.使用指针变量作函数参数采取的是"值传递"的方式。
{{ select(34) }}
- 正确
- 错误
10.如果数组中每个元素都是具有相同的数据类型的指针,则这种数组称为指针数组。
{{ select(35) }}
- 正确
- 错误
三、填空题
- 以下程序的执行结果是___________。
#include <stdio.h>
int main() {
int a[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},*p[4], i;
for (i = 0; i < 4; i++) p[i] = &a[i * 3];
printf("%d\n", p[3][2]);
return 0;
}
{{ input(36) }}
2.若有定义:int a[]={2,4,6,8,10,12}, *p=a;则*(p+1)的值是___________。
{{ input(37) }}
- 已知有以下的说明,
int a[]={8,1,2,5,0,4,7,6,3,9};
那么a[*(a+a[3])]的值为___________。
{{ input(38) }}
- 在C程序中,指针变量的值增1,表示指针变量指向___________存储单元。
{{ input(39) }}
- 以下程序中,select 函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标,请填空。
#include <stdio.h>
#define N 3
#define M 3
int select(int a[N][M], int *n) {
int i, j, row = 1, colum = 1;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
if (a[i][j] > a[row][colum]) {
row = i;
colum = j;
}
*n = ___________;
return a[row][colum];
}
int main() {
int a[N][M] = {9, 11, 23, 6, 1, 15, 9, 17, 20}, max, n;
max = select(a, &n);
printf("max=%d,line=%d\n", max, n);
return 0;
}
{{ input(40) }}
- 输入10个整数存入一维数组,从中查找某个整数X,查到则输出其是第几个数,查不到则输出“Not Find!”。请填空。
#include <stdio.h>
int main () {
int a[10],*p = a, x, n, flag = 0;
for (; p < a + 10; p++) scanf ("%d", p);
scanf ("%d", &x);
for (n = 1, p = a; ___________ ; p++, n++)
if (*p == x) {
flag = 1;
break;
}
if (! flag) printf ("Not Find! \n");
else printf ("%d\n", n);
return 0;
}
{{ input(41) }}
- 执行以下程序后,输出结果为___________。
#include <stdio.h>
int main() {
char *s[6] = {"564", "379", "207", "816", "xyz", "abc"};
char **p;
int i;
p = s;
for (i = 0; i < 5; i++)
printf("%s", p[i]);
return 0;
}
{{ input(42) }}
- 一个专门用来存放另一个变量地址的变量叫___________。
{{ input(43) }}
- 以下程序的执行结果是___________。
#include <stdio.h>
int main() {
char a[] = "abcdefg",*p;
p = a;
*(p + 3) += 2;
printf("ch=%c\n", *(p + 5));
return 0;
}
{{ input(44) }}
- 以下程序的执行结果是___________。
#include <stdio.h>
int main() {
int a = 50,*p;
p = &a;
*p = 100;
printf("a=%d\n", a);
return 0;
}
{{ input(45) }}
- 以下程序的输出结果是___________。
#include <stdio.h>
void sub(int *a, int n, int k);
int main() {
int x = 0;
sub(&x, 8, 1);
printf("%d\n", x);
return 0;
}
void sub(int *a, int n, int k) {
if (k <= n) sub(a, n / 2, 2 * k);
*a += k;
}
{{ input(46) }}
mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。
请填空。
int mystrlen(char *str){
int i;
for(i=0; ___________!='\0';i++);
return i;
}
{{ input(47) }}
- 以下程序的执行结果是___________。
#include <stdio.h>
int main() {
int a[] = {2, 3, 4},*p, s, i;
s = 1;
p = a;
for (i = 0; i < 3; i++) s *= *(p + i);
printf("s=%d\n", s);
return 0;
}
{{ input(48) }}
- 执行以下程序段后,a的值为___________。
static int s[]={5,8,4,6,10,7};
int a,i,*p;
a=10; p=&s[0];
for(i=0;i<6;i++)
a=(*(p+i)<a)?*(p+i):a;
{{ input(49) }}
- 执行以下程序段后,m的值是___________。
int a[]={7,4,6,3,10},m,k,*ptr;
m=10;
ptr=&a[0];
for(k=0;k<5;k+=2) m=(*(ptr+k)<m)?*(ptr+k):m;
{{ input(50) }}