第八章 指针

课程名称:C语言程序设计 总分:85 答题时长:100分钟 出卷人:王赛楠

、单项选择题:(共14题,14分)
1 若已定义 int a = 5 ; 下面对 ①、② 两个语句的正确解释是_______。

① int *p = &a ;  ② *p = a ;

语句①和②中的*p含义相同,都表示给指针变量p赋值。
①和②语句的执行结果,都是把变量a的地址值赋给指针变量p。
①在对p进行说明的同时进行初始化,使p指向a;②将变量a的值赋给指针变量p。
①在对p进行说明的同时进行初始化,使p指向a;②将变量a的值赋为*p。
2 若需要建立如下图9-16所示的存储结构,且已有说明float *p , m = 3.14 ; 则正确的赋值语句是_______。

图9-16

p = m ;  
p = &m ;
*p = m ;
*p = &m ;
3 有如下语句 int a = 10 , b = 20 , *p1 , *p2 ; p1 = &a ; p2 = &b ; 如图9-17所示;若要实现图9-18所示的存储结构,可选用的赋值语句是_______。

图9-17                图9-18

*p1 = *p2 ; 
p1 = p2 ; 
p1 = *p2 ; 
*p1 = p2 ;
4 若有说明:int *p ,  n ; 以不正确的程序段是_______。
scanf( "%d" , &n ) ;         

p=&n; *p = n ; 

scanf( "%d" , &n ) ;

p=&n; 

p = &n ;                   

scanf( "%d", &p ) ; 

p = &n ;

scanf( "%d" , p ) ;

5 下列选项中正确的语句组是_______。
char s[8] ; s = { "Beijing" } ;
char *s ; s = { "Beijing" } ;
char s[8] ; s = "Beijing" ;
char *s ; s = "Beijing" ;
6 若有定义:int a[5] ; 则a数组中首元素的地址可以表示为_______。
&a 
a + 1
&a[1]
7 有以下程序段

int a[10] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } , *p = &a[3] , b ;

b = p[5] ;

b中的值是_______。

5
6
8
9
8 设有以下定义和语句

int a[3][2] = {1 , 2 , 3 , 4 , 5} , *p[3] ;

p[0] = a[1] ;

则*( p[0] + 1 )所代表的数组元素是_______。

a[2][0]
a[1][0]
a[1][1]
a[1][2]
9 设char *s = "\ta\017bc" ; 则指针变量s指向字符串所占的字节数是_______。
9
5
6
7
10 下面程序段的运行结果是_______。

char a[ ] = "language" , *p ;

p = a ;

while ( *p != 'u' ) { printf( "%c" , *p – 32 ) ; p++ ; }

LANGUAGE
language
LANG
langUAGE
11 阅读以下函数

int fun( char *sl , char *s2 )

{

int i = 0;

while( sl[i] == s2[i] && s2[i] != '\0' ) i++ ;

return( sl[i] == '\0' && s2[i] == '\0' ) ;

}

此函数的功能是_______。

将s2所指字符串赋给s1
比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0
比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为0
比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为0
12 在声明语句“int *f() ;”中,标识符f代表的是_______。
一个用于指向整型数据的指针变量
一个用于指向一维数组的行指针
一个用于指向函数的指针变量
一个返回值为指针型的函数名
13 有以下程序段

#include<stdio.h>

int main( )

{   int a = 5 , *b , **c ;

c = &b ; b = &a ;

return 0 ;  

}

程序在执行了c = &b ; b = &a ; 语句后,表达式**c的值是________。

变量a的地址
变量b的值
变量a的值
变量b的地址
14 若有定义:int *p[3] ;,则以下叙述中正确的是_______。
定义了一个基类型为int的指针变量p,该变量具有三个指针
定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
定义了一个名为*p的整型数组,该数组含有三个int类型元素
定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
、填空题:(共6题,30分)
1 在C程序中,指针变量能够赋_______值或_______。
2 请填空:建立如下图9-19所示存储结构所需的说明语句是_______。建立如下图9-19所示为变量a输入数据的输入语句是_______。建立如下图9-19所示存储结构所需的赋值语句是_______。

图9-19

3 以下程序段通过移动指针变量m,将如下图9-20所示连续动态存储单元的值,从第一个元素起,输出到终端屏幕。请填空。(假设程序段中的所有变量均已正确说明)

图9-20

for( m = q ; m – q < 10 ; m++ ) printf( "%d, " , _______) ;

printf( "\n" ) ;

4 以下程序段通过指针变量q,给如下图9-21所示连续动态存储单元赋值(在此过程中不能移动q)。请填空。(假设程序段中的所有变量均已正确说明)

图9-21

_______  scanf( "%d" , q + k );

5 若有以下定义和语句,在程序中引用数组元素x[i]的4种形式是:_______、_______、_______和x[i]。(假设i已正确说明并赋值。)

int x[10] , *p ;

p = x;

6 str_len函数的功能是计算str所指字符串的长度,并作为函数值返回,请填空。

int str_len( char *str )

{  

int i ;

for( i = 0 ; _______ != '\0' ; i++ )   ;

return(_______ ) ;

}

编程题:(共2题,16分)
1 编写一个程序,其中用户自定义函数strcompare函数实现两个字符串s1,s2的比较,函数原型声明如下:

int strcompare( char *str1 , char *str2 ) ;

分别有如下要求:

(1)调用函数时实参用数组名,函数形参用指针变量。

(2)调用函数时实参和函数形参都用指针变量。

(3)调用函数时实参用指针变量,函数形参用数组名。

[注]:

(1)要求当s1== s2时,函数返回值为0;如果s1≠ s2,返回它们二者第一个不相同字符的ASCII码差值(如“BOY”与“BAD”,第二个字母不相同,“O”与“A”之差为79-65=14);如果s1>s2,则输出正值;如s1<s2,则输出负值。

(2)两个字符串s1、s2由main函数输入,strcompare函数的返回值也由main函数输出。

2 编写一个程序,从键盘输入3个数,使用函数调用实现由小到大顺序输出,函数的原型声明如下:

viod sort( int *a , int *b , int *c ) ;

程序阅读题:(共5题,25分)
1 下面程序的运行结果是_______。

#include<stdio.h>

int main( )

{

       char a[ ] = "Language" , b[ ] = "Programe" ;

       char *p1 , *p2 ;

       int k ;

       p1 = a ;

p2 = b ;

       for( k = 0 ; k <= 7 ; k++ )

              if( *( p1 + k ) == *( p2 + k ) )

                     printf("%c" , *( p1 + k ) ) ;

      return 0 ;

}

2 以下程序的运行结果是_______。

#include<stdio.h>

#include<string.h>

int main( )

{

       char s[20] = "abcd" ;

       char *sp = s ;

       sp++ ;

       puts( strcat( sp , "ABCD" ) ) ;

       return 0 ;

}

3 下面程序的运行结果是_______。

#include<stdio.h>

int *f( int *x , int *y )

{

      if( *x + 5 < *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 ;

}

4 下面程序的运行结果是_______。

#include<stdio.h>

void f( int y , int *x )

{

       y = y + *x ; 

       *x = *x + y ;

}

int main( )

       int x = 2 , y = 4 ;

       f( y , &x ) ;

       printf( "%d   %d\n" , x , y ) ;

       return 0 ;

}

5 下面程序的运行结果是_______。

#include<stdio.h>

void fun( int *a , int *b )

{

       printf( "%d %d\n" , *a , *b ) ;

       *a = 2 ; *b = 4 ;

}

int main( )

{  

       int x = 1 , y = 3 ;

       fun( &y , &x ) ;

       printf( "%d %d\n" , x , y ) ;

       return 0 ;

}