第五章 指针
一.
单项选择题:
1.变量的指针,其含义为指该变量的 。
A. 值 B. 地址 C. 名 D. 一个标志
2.设ptr1和ptr2均为指向同一个int型一维数组的指针变量,k为int型变量,则下
面不能正确执行的赋值语句是 。 A. k = *ptr1 + *ptr2; B. ptr2 = k;
C. ptr1 = ptr2; D. k = *ptr1 * (*ptr2);
3.设char *s=”\\ta\\017bc”,则指针变量s指向的字符串所占的字节数是 。 A. 9 B. 5 C. 6 D. 7 4.以下程序有错,错误原因是 。 main()
{ int *p,i; char *q,ch;
p=&i; q=&ch; *p=40; *p=*q; …… }
A. p和q的类型不一致,不能执行*p=*q;语句
B. *p中存放的是地址值,因此不能执行*p=40;语句 C. q无具体指向,所以*q无实际意义
D. q虽然指向了具体的存储单元,但该单元无确定值,故不能执行*p=*q; 5.有四组对指针变量操作的语句,以下判断正确的是 。 (1) int *p,*q; q=p; int a,*p,*q; p=q=&a;
(2) int a,*p,*q; q=&a; p=*q; int a=20,*p; *p=a;
(3) int a=b=0,*p; p=&a; b=*p; int a=20,*p,*q=&a; *p=*q; (4) int a=20,*p,*q=&a; p=q; a=*p;
A. 正确:(1) 不正确:(2) (3) (4) B. 正确:(1) (4) 不正确:(2) (3) B. 正确:(3) 不正确:(1) (2) (4) D. 正确:(4) 不正确:(1) (2) (3)
6.设程序段 char s[]=”china”; char *p; p=s; 则下列叙述正确的是 。 A. s和p完全相等
B. 数组s中的内容和指针变量p中的内容完全相等 C. s数组长度和p所指向的字符串长度完全相等 D. s[0]和*p相等
7.设有以下语句,则 不是对a数组元素的正确引用,其中0≤i<10。 int a[10] = {0,1,2,3,4,5,6,7,8,9}; int *p = a; 供选择的答案是:
A. a[p-5] B. *(&a[i]) C. p[i] D. *(a+i) 8.若有定义:char s[20]=”programming”, *ps=s;
26
则不能代表字符‘o’的表达式是 。
A. ps+2 B. s[2] C. ps[2] D. ps+=2, *ps 9.若有以下定义和语句:
int **pp, *p, a=10, b=20;
pp=&p; p=&a; p=&b; printf(“%d,%d\\n”, *p, **pp); 则输出结果是: 。
A. 10,20 B. 10,10 C. 20,10 D. 20,20
10.指针a所指的字符串长度为 ,这个长度是可以用strlen(a)测出来的。 char *a = \ 供选择的答案是:
A. 26 B. 27 C. 28 D. 23
11.已设p1和p2为指针变量,且已指向同一个数组中的元素,a是一个整型变量,问下面哪一个语句不能正确执行? A. a = *p1 B. a = *p1 + *p2 C. a = p1 - p2 D. p1 = a - p2
12.有一个二维数组a[3][4], 2行3列元素的正确表示方法为 。 A. &a[2][3] B. a[2] + 3 C. *(a + 2) + 3 D. *(a[2] + 3)
13.指向一个包含4个整型元素的一维数组的指针变量的定义形式为 。 A. int (*p)[4] B. int *p[4] C. int (p[4]) D. int (p)[ ] 14.设有以下程序片段:
char a[4][12] = {\ int i ;
for ( i = 0 ; i < 4 ; i++ ) p[ i ] = a[ i ] ;
下面 不是对一个字符串的正确引用(其中0≤i<1)。 A. a[i] B. p[i] C. *p D. p
二、填空题:
1.定义 int a[]={0,1,2,3},*p=&a[1]; 则 ++(*p) 的值是 。 2.定义 int a[]={0,1,2,3},*p=&a[2]; 则 *--p 的值是 。 3.定义 int a[]={2,4,6,8,10,12},*p=a;
则 *(p+1) 的值是 , *(a+5) 的值是 。 4.定义 int a[2][3]={2,4,6,8,10,12};
则 *(&a[0][0]+2*2+1) 的值是 , *(a[1]+2) 的值是 。 5.定义 int s[2][3]={0},(*p)[3];p=s; 则 **(p+1) 表示数组元素 。 6.定义 int a[2][3]={2,4,6,8,10,12};
则 a[1][0] 的值是 , *(*(a+1)+0) 的值是 。 7.定义 int *p[3],a[6],i;
for (i=0;i<3;i++) p[i]=&a[2*i];
27
则 *p[0] 引用的是a数组元素 。 *(p[1]+1) 引用的是a数组元素 。 8.设有以下语句:
static int a[4] = {2,4,6,8};
static int *p1[4] = {&a[0],&a[1],&a[2],&a[3]}; int **p; p = p1;
则 **(p+2) 的值是 ,*(p+3) 的值是元素 的地址。 9.下面程序段的运行结果是 。 char s[20]=”abcd”; char *sp=s; sp++; puts(strcat(sp,”ABCD”));
10.下面程序段的运行结果是 。 char s[80],*sp=”HELLO!”;
sp=strcpy(s,sp); s[0]=?h?; puts(s);
11.以下语句有错,错误原因是 。 #include
12.下面程序段的运行结果是 。 char a[]=”12345”,*p; int s=0;
for (p=a;*p!=?\\0?;p++) s=10*s+*p-?0?; printf(“%d\\n”,s);
13.下面程序段的运行结果是 。 char str[]=”abc\\0def\\0ghi”,*p=str; printf(“%s”,p+5);
14.下面程序段的运行结果是 。 char *p=”PDP1-0”; int i,d; for(i=0;i<7;i++) { d=*(p+i);
if(d!=0) printf(“%c*”,*(p+i)); }
15.下面程序段的运行结果是 。 char a[]=”123456789”,*p; int i=0; p=a;
28
while(*p)
{ if(i%2==0) *p=?*?; p++; i++; }
printf(“%s”, a );
三 、判断题:
1.指针变量用于存放指针所指对象的地址。( ) 2.指针就是变量的地址。( )
3.通过指针可以间接引用指针所指的变量。( ) 4.“指针”与“指针变量”是同一个概念。( ) 5.一个指针变量只能指向同一类型的变量。( ) 6.可以给指针变量赋一个整型值。( ) 7.所谓数组的指针就是指数组元素的地址。( )
8.若定义 int a[5],*p=a; 则 *&a[5] 是对a数组元素的正确引用。( )
9.若定义 int a[2][3]; 则 *(*(a+i)+j) 是对a数组第i行第j列元素的正确引用。( )
四 程序阅读题:
1.执行以下程序段后,sum的值为: 。 static int a[3][3] = {7,2,1,3,4,8,9,2,6}; int sum, *p;
p = a[0]; sum = (*p)*(*(p+4))*(*(p+8));
2.下面程序的运行结果是 。 #include \ int a[ ] = {1,5,7,9,11,13}; main()
{ int *p; p = a + 3;
printf(\ printf(\ }
3.下面程序的运行结果是 。 #include \ main()
{ char *ptr1, *ptr2; ptr1 = ptr2 = \
while ( *ptr2 != '\\0' ) putchar(*ptr2++); while ( --ptr2 >= ptr1 ) putchar(*ptr2);
29
putchar('\\n'); }
4.有以下main()函数,经过编译连接后得到的可执行文件为file1.exe,若在dos系统下输入命令行:file1 beijing shanghai<回车>,则得到的输出是 。 main(int argc,char *argv[])
{ while(argc>1) { ++argv;
printf(“%s\\n”,*argv); --argc; } }
五. 程序填空题:
1.以下程序对数组a中的数据进行降序排序。请填空。 #define N 10 main()
{ int a[N],i,j,k; k=N;
printf(“Enter - data that will be sorted:\\n”,k); for(i=0;i if(*(a+i)<*(a+i+1)) { j=*(a+i); *(a+i)=*( ② ); *( ③ )=j; } for(i=0;i 2.程序通过指针数组p和一维数组a构成如下所示的二维数组的左下半三角结构,然后输出。请填空。 1 6 7 11 12 13 16 17 18 19 21 22 23 24 25 #define M 5 #define NUM (M+1)*(M)/2 30