#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
  1. 以下程序运行之后的输出结果是______。
#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
  1. 以下函数的功能是______。
void fun(int *p1, int *p2) {
	int *p;
	*p = *p1;
	*p1 = *p2;
	*p2 = *p;
}

{{ select(3) }}

  • 正确,但没有交换*p1*p2的值。
  • 使用了空指针,可能造成系统故障。
  • 能成功交换*p1*p2的值。
  • 能成功交换*p1*p2的地址。
  1. 有以下程序:
#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
  1. 以下程序的输出结果是______。
#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
  1. 若有以下说明:
int w[3][4]={{0,1},{2,4},{5,8}};
int (*p)[4]=w;

则数值为4的表达式是______。

{{ select(6) }}

  • *w[1]+1
  • p++,*(p+1)
  • w[2][2]
  • p[1][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
  1. 若有语句:int a=4, *p=&a;,下面均代表地址的一组选项是______。

{{ select(8) }}

  • a,p,&*a
  • *&a,&a,*p
  • &a,p,&*p
  • *&p,*p,&a
  1. 以下程序的输出结果为______。
#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
  1. 以下程序的输出结果是______。
#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
  1. 以下定义中与int *p[4]等价的是______。

{{ select(11) }}

  • int p[4]
  • int *p
  • int *(p[4])
  • int (*p)[4]
  1. 以下程序的运行结果是______。
#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
  1. char *aa[2]={"abcd","ABCD"}; 则以下说法中正确的是______。

{{ select(13) }}

  • aa数组元素的值分别是"abcd"和"ABCD"。
  • aa是指针变量,它指向含有两个数组元素的字符型一维数组。
  • aa数组的两个元素分别存放的是含有4个字符的一维字符数组首地址。
  • aa数组的两个元素中各自存放了字符'a'和'A'的地址。
  1. 已知函数定义如下:
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
  1. 若有以下定义:int a[]={1,2,3,4,5,6,7,8,9,10}, *p=a; 表达式的值为3的是______。

{{ select(15) }}

  • p+=2,*(p++)
  • p+=2,*++p
  • p+=3,*p++
  • p+=2,++*p
  1. 以下程序段执行完后,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) }}

  • x
  • x-‘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
  1. 以下程序的输出结果是______。
#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
  1. 有以下程序:
#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
  1. 已知有以下的说明,那么执行语句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
  • 语句有错
  1. 如下程序的执行结果是______。
#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
  1. 有以下程序:
#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
  1. 如下程序的执行结果是______。
#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
  1. 已知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) }}

  • 正确
  • 错误

三、填空题

  1. 以下程序的执行结果是___________。
#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) }}

  1. 已知有以下的说明,
int a[]={8,1,2,5,0,4,7,6,3,9};

那么a[*(a+a[3])]的值为___________。

{{ input(38) }}

  1. 在C程序中,指针变量的值增1,表示指针变量指向___________存储单元。

{{ input(39) }}

  1. 以下程序中,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) }}

  1. 输入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) }}

  1. 执行以下程序后,输出结果为___________。
#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) }}

  1. 一个专门用来存放另一个变量地址的变量叫___________。

{{ input(43) }}

  1. 以下程序的执行结果是___________。
#include <stdio.h>
int main() {
	char a[] = "abcdefg",*p;
	p = a;
	*(p + 3) += 2;
	printf("ch=%c\n", *(p + 5));
	return 0;
}

{{ input(44) }}

  1. 以下程序的执行结果是___________。
#include <stdio.h>
int main() {
	int a = 50,*p;
	p = &a;
	*p = 100;
	printf("a=%d\n", a);
	return 0;
}

{{ input(45) }}

  1. 以下程序的输出结果是___________。
#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) }}

  1. mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。

请填空。

int mystrlen(char *str){
  int i;
  for(i=0; ___________!='\0';i++);
  return i;
 }

{{ input(47) }}

  1. 以下程序的执行结果是___________。
#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) }}

  1. 执行以下程序段后,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) }}

  1. 执行以下程序段后,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) }}