您的当前位置:首页c语言 指针讲义 复习资料

c语言 指针讲义 复习资料

2023-05-20 来源:乌哈旅游
第十章 指针 (10学时)

学习目的与要求:

1 、理解地址和指针的概念;

2 、重点掌握指针变量的定义和引用;

3 、重点掌握指向数组的指针和通过指向数组的指针操纵数组;

4 、重点掌握指向字符串的指针和通过指向字符串的指针操纵字符串 ; 5 、理解指向指针的指针、指针数组等概念。

重点:

1 、指针变量的定义和引用;

2 、指向数组的指针和通过指向数组的指针操纵数组;

3 、指向字符串的指针和通过指向字符串的指针操纵字符串

第1讲 知识归纳:

1、地址和指针的概念:

(1) 地址:内存区的每一个字节的编号 ;

(2) 指针:一个变量的地址称为该变量的指针,即地址就是指针,指针就是地址;

2、指向变量的指针变量:

(1) 指针变量:是指专门用来存放变量地址的一类变量 ; (2) 注意区分指针和指针变量的概念;

指针是地址;指针变量是存放地址的变量;

平时所说的定义一个指针,实际上是指定义一个指针变量;

3、指针变量的定义和引用:

(1) 定义指针变量格式: 基类型 * 指针变量名 ; (2) 如何确定指针变量的类型?

要定义的指针准备指向什么类型变量,该指针就是什么类型; (3) 如何让一个指针指向一个变量? 将变量的地址赋值给指针变量; & -----取地址运算符;

如 : int a =5 ;

int * pa ; int pa = &a ; (4) 指针变量的引用: *-----取内容运算符, 该运算符与指针变量结合,表示指针所指向的变量的内容; 如:printf (“ % d ,%d\\n “, * pa , a ) ; 下面是错误的:

int * pa ;

printf (“ % d \\n “, * pa ) ; //一个指针在没有指向一个确切的存储空间时,是不能使用 * pa

4、指针总结:

int a = 5 ; int * pa =&a ; 在定义指针,并指向某个变量后,我们可以得出如下结论: (1) *pa 等价于 a (2) pa 等价于 &a

(3) & * pa 等价于 &a 、 pa (4) * &a 等价于 a

基础训练(A)

一、选择题

1、已知:int *p,a;则语句“p=&a;”中的运算符“&”的含义是( )。 A)位与运算 B)逻辑与运算 C)取指针内容 D)取变量地址

2、已知:double d;希望指针变量pd指向d,下面对指针变量pd的正确定义是 ( )。 A)double pd; B)double &pd C)double *pd D)double *(pd)

3、若x为整型变量,p是指向整型数据的指针变量,则正确的赋值表达式是( )。 A)p=&x B)p=x C)*p=&x D)*p=*x 二、填空题

1、要使指针变量与变量之间建立联系,可以用运算符 来定义一个指针变量,用运算符 来建立指针变量与变量之间的联系。

2、已知:int a=10,*p=&a;则“printf(\"%d,%d\\n\的输出结果是 。

3、已知:float f1=3.2,f2,*pf1=&f1;现在希望变量f2的值为3.2,可使用赋值语句 或 。 4、已知:int b=5,*p=&b;并且b的地址为4000,则“printf(\"%d,%d\的输出结果是 。 三、阅读程序,回答问题。 1、main() { int var, *p;

var=100; *p=&var; var=*p+10;

printf(\"%d\}

运行结果:

2、# include void prtv(int *x)

{ printf(\"%d\\n\}

main() { int a=25; prtv(&a); }

运行结果:

能力提高(B)

一、选择题

1、已知:int a,*p=&a;则下列函数调用中错误的是( )。 A)scanf(\"%d\)scanf(\"%d\C)printf(\"%d\)printf(\"%d\

2、已知:int i=0,j=1,*p=&i,*q=&j;错误的语句是( )。 A) i=*&j; B) p=&*&i; C)j=*p; D)i=*&q;

3、函数的功能是交换变量x和y中的值,且通过正确调用返回交换的结果。能正确执行此功能的函数是( )。

A)funa(int *x,int *y) { int *p;

*p=x; *x=*y; *y=*p; }

B)funb(int x,int y) { int t;

t=x; x=y; y=t; }

C)func(int *x,int *y) { *x=*y; *y=*x; }

D)fund(int *x,int *y) { int t;

t=*x; *x=*y; *y=t; }

二、阅读程序,写出运行结果 1、# include main() { int a,b; a=5;b=10;

printf(\"before swap a=%d,b=%d\\n\swap(a,b);

printf(\"after swap a=%d,b=%d\\n\}

swap(int x,int y) { int temp;

temp=x; x=y; y=temp;

printf(\"in swap x=%d,y=%d\\n\}

运行结果:

2、# include main() { int a,b; a=5;b=10;

printf(\"before swap a=%d,b=%d\\n\swap(&a,&b);

printf(\"after swap a=%d,b=%d\\n\}

swap(int *px,int *py) { int temp;

temp=*px; *px=*py; *py=temp;

printf(\"in swap x=%d,y=%d\\n\}

运行结果:

比较上面两个程序,试说明两者的区别?

第2讲 知识归纳:

1、指针变量做实参:

(1) 指针变量做实参,实质传的是指针所指向的变量的地址-----即传地址调用;

(2) 指针变量做实参 ,形参必须是指针,即通过形参指针操纵主调函数中的变量;

2、指向数组的指针变量:

(1) 定义一个指向数组元素的指针变量的方法,与定义指向变量的指针变量相同; (2) 使指针指向数组首地址 :将数组名赋值给已定义的指针变量;

使指针指向数组的某一元素: 将数组元素地址赋值给已定义的指针变量; 如:int arr[ 10 ]; int * p ; //定义指针变量,类型与将要指向的数组类型一致; p = arr ; //p 指针指向 arr数组的首地址;等价于 p = & arr[0];

p = &a [ 9] ; // p 指针指向 arr数组的最后一个元素arr[9] ;

3、通过指针引用数组元素:

int arr[ 10 ]; int * p = arr ;

在定义指针,并指向某个数组的首地址后,我们可以得出如下结论:

(1) (1) p + i =arr + i = &arr[ i ] ,均表示 arr数组的第 i 个元素的地址 ; 指针变量加1 ,即在指针当前所指向的元素的地址基础上+ 一个数组元素的字节数 ;即 p + i*d //d是一个数组元素的字节数; (2) (2) *(p+i) = *(arr + i) = arr[i] , 均表示 arr 数组的第 i 个元素; (3)数组元素的两种表示方法:

下标法: arr[ i ] , p [ i ] // 均表示arr数组的第 i 个元素; 指针法: * ( p+i) , * (arr+i) //均表示arr数组的第 i 个元素;

4、在使用指向数组的指针变量时,应注意的问题:

int arr[ 10 ]; int * p = arr ;

在定义指针,并指向某个数组的首地址后: (1) p ++ ; 正确 ;但 arr++ ; 不正确 ;

因为 arr 表示数组名 ,是常量,不能执行 arr = arr + 1 ; (2) 要注意 指针变量的当前值;

(3) ) ( * p ) ++ ----表示p所指向的元素值加一 ;即 arr [ 0] ++ ;

* p ++ 、* ( p ++ ) ------ 先取指针所指向空间的内容, 即 arr[0] , 然后指针pa 下移一个存储空间, 指向 arr[1] ;

(4) * ++pa ------指针pa 先下移一个存储空间,然后取指针所指向空间的内容;

基础练习(A)

一、选择题

1、已知:int a[10],*p=a;则下面说法不正确的是 ( )。

A)p指向数组元素a[0] B)数组名a 表示数组中第一个元素的地址 C)int a[10],*p=&a[0];与上述语句等价 D)以上均不对

2、已知:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示数组a中元素的表达式是 ( )。 A)*p B)a[10] C)*a D)a[p-a] 二、填空题

1、在C语言中,指针变量的值增1,表示指针变量指向下一个 ,指针变量中具体增加的字节数由系统自动根据指针变量的 决定。

2、已知:int a[5],*p=a;则p指向数组元素a[0],那么p+1指向 。若“ printf(\"%d\的输出结果是200,那么:“ printf(\"%d\的输出结果是 。

3、对数组元素的引用方法有两种: 和 。设int a[10],*p=a;则对a[3]的引用可以是 或 。 4、在C程序中,可以通过三种运算来移动指针: 、 、 。 5、设有如下定义:

int a[5]={0,1,2,3,4},*p1=&a[1],*p2=&a[4];则p2-p1的值为 ______ ,*p2-*p1的值为 。 三、阅读程序,写出运行结果 1、main() { int a[10],i,*p; *p=a;

for (i=0; i<10; i++) scanf(\"%d\for (;p执行程序,输入:0 1 2 3 4 5 6 7 8 9 运行结果:

2、main() { int a[10],*p; p=&a[0];

for (;pfor (p=a+9; p>=a; p--) printf(\"%d\}

执行程序,输入:0 1 2 3 4 5 6 7 8 9 运行结果:

能力提高(B)

一、选择题

1、已知:int a[]={1,2,3,4},y,*p=&a[1];则执行语句\"y=*p++;\"之后,变量y的值为 ( )。 A) 3 B) 2 C) 1 D) 4

2、已知:int a[]={1,2,3,4},y,*p=&a[0];则执行语句\"y=++(*p);\"之后,下面( )元素的值发生了变化。

A) a[0] B) a[1] C) a[2] D) 都没发生变化

3、已知:int x[]={1,3,5,7,9,11},*ptr=x;则能够正确引用数组元素的语句是 ( )。 A) x B) *(ptr--) C) x[6] D) *(--ptr)

4、若有以下语句并且0<=k<6,则正确表示数组元素地址的语句是( )。 int x[]={1,3,5,7,9,11},*ptr=x,k;

A) x++ B) &ptr C) &ptr[k] D)&(x+1)

5、已知:int a[]={1,2,3,4,5,6},*p=a;则值为3的表达式是 ( )。 . A) p+=2,*(p++) B) p+=2,*++p C) p+=3,*p++ D) p+=2,++*p

6、若第一个printf语句的输出为194,则第二个printf语句的输出为( )。

int a[10],*p=a; printf(\"%x\printf(\"%x\

A) 203 B) 212 C) 1a6 D)19d 二、阅读程序,写出运行结果 1、# include main()

{ int a[]={1,2,3,4,5}; int x,y,*p; p=&a[0]; x=*(p+2); y=*(p+4);

printf(\"*p=%d,x=%d,y=%d\\n\}

运行结果:

2、# include main()

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

printf(\"%d,\printf(\"%d,\printf(\"%d,\printf(\"%d,\p+=3;

printf(\"%d,%d\\n\

}

运行结果: 三、程序填空

1、下面的程序实现从10个数中找出最大值和最小值.

int max,min;

find_max_min(int *p,int n) { int *q;

max=min=*p; for (q= ; ; q++) if ( ) max=*q; else if ( ) min=*q; }

main()

{ int i,num[10];

printf(\"input 10 numbers:\\n\"); for (i=0; i<10; i++) scanf (%d\find_max_min(num,10);

printf(\"max=%d,min=%d\\n\} 四、编程

1、编写两个函数,分别完成一维数组的输入和输出.

main() { int a[10]; input(a,10); output(a,10); }

void input(int *p,int n) {

}

void output(int *p,int n) { }

第3讲 知识归纳:

1、数组、指针和函数的结合应用:

传值调用 变量名 变量地址 指针 传地址调用 数组名 数组 数组名或数组元素地址 指针 实参类型 的类型 要求形参变量名 传递的信变量的值 息 通过函数不能 调用能否 改变实参的值 变量的地址 能 数组的起始地址 能 数组的起始地址或数组元素地址 能 2、二维数组的地址问题:

int a [3][4] = { 1,2 ,3,4,5,6,7,8,9,10,11,12} ;

int * p = a ;

(1) (1) a ------数组名表示数组的首地址 ; 等价于 *( a + 0 ) 、* a

(2) (2) a [ i ] ------表示数组的第 i行的行地址,即 第 i行第一个元素的地址;

等价于 *( a + i ) 、* ( p + i ) ;

(3) (3) &a [ i ][ j ] ------表示数组的第 i行 j 列元素的地址; 等价于 *( a + i ) +j

和 *( p + i ) +j

(4) (4) a [ i ][ j ]----- 表示数组的第 i行 j 列元素;等价于 * ( *( a + i ) +j ) ;

和 * ( *( p + i ) +j ) ;

3、指向二维数组的行指针:

int a [3][4] = { 1,2 ,3,4,5,6,7,8,9,10,11,12} ;

int ( * p )[4 ] = a ; (1) (1) int ( * p )[4 ] = a ;

表示 p 是一个指向二维数组(一行有四个元素的)行地址的行指针; (2) p + 1 ; 行指针加 1 ,是加 一行元素的字节数的和;

p = p + 1 ; 行指针从当前行指向下一行;

基础练习(A)

一、选择题

1、已知:int a[3][4],*p=a;则p表示 ( )。

A) 数组a的0行0列元素 B) 数组a的0行0的地址 C) 数组a的0行首地址 D) 以上均不对

2、已知:int a[3][4],*p;若要指针变量p指向a[0][0],正确的表示方法是 ( )。 A) p=a B) p=*a C) p=**a D) p=a[0][0]

3、已知:double b[2][3],*p=b,下面哪个不能表示数组b的0行0列元素 ( )。 A) b[0][0] B) **p C) *p[0] D) *p

4、设有说明int (*ptr)[M];其中的标识符ptr是 ( )。

A) M个指向整型变量的指针

B) 指向M个整型变量的函数指针

C) 一个指向M个整型元素的一维数组的指针

D) 具有M个指针元素的一维指针数组,每个元素都只能指向整型变量 二、填空题

1、已知:下面程序段中第一个printf语句的输出是200,则第二个printf语句的输出是 ,第三

个printf语句输出是 。 int a[3][4],*p=a; printf(\"%d\printf(\"'%d\printf(\"%d\

2、已知:int a[2][3]={1,2,3,4,5,6},*p=&a[0][0];则表示元素a[0][0]的方法有指针法: ,数组名法: 。 *(p+1)的值为 。 三、阅读程序,写出运行结果 1、main()

{ int a[2][3]={0,1,2,3,4,5},*p1,*p2; p1=a; p2=&a[0][0];

printf(\"%d,%d\\n\printf(\"%d,%d\\n\printf(\"%d,%d\\n\

printf(\"%d,%d\\n\}

假设数组a的首地址为3000,则运行结果为:

能力提高(B)

一、选择题

1、已知:int i,x[3][4];则不能把x[1][1]的值赋给变量i的语句是 ( )。 A) i=*(*(x+1)+1) B) i=x[1][1] C) i=*(*(x+1)) D) i=*(x[1]+1}

2、已知:static int a[2][3]={2,4,6,8,10,12};正确表示数组元素地址的是 ( )。 A) *(a+1) B) *(a[1]+2) C) a[1]+3 D) a[0][0] 二、阅读程序,写出运行结果 1、main()

{ int a[2][3]={{1,2,3},{4,5,6}}; int m,*ptr; ptr=&a[0][0];

m=(*ptr)*(*(ptr+2))*(*(ptr+4)); printf(\"%d\\n\}

2、main()

{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,13}; int (*ptr)[4]; int sum=0,i,j; ptr=a;

for (i=0;i<3;i++) for (j=0;j<2;j++) sum+=*(*(ptr+i)+j); printf(\"%d\\n\}

运行结果: 三、程序填空

1、下面程序通过指向整型的指针将数组a[3][4]的内容按3行*4列的格式输出,请给printf()填入适当的参数,使之通过指针p将数组元素按要求输出.

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p=a; main() { int i,j;

for (i=0; i<3; i++ ) for (j=0; j<4; j++ ) printf(\"%4d\

第4讲 知识归纳:

1、指向字符串的指针变量:

(1) 定义指向字符串的指针:

char * 指针名 = 字符串 ;

如 char * ps = “I am a teacher .” ;

//这里是将 字符串的首地址存放在字符指针中,而不是将字符串中的字符存入指针; (2) 比较:

char * ps = “I am a teacher .” ; √

分开: char *ps ;

ps = “I am a teacher .” ; √

//因为 可以将字符串的首地址存放在指针中; char s [ 20 ] = “I am a teacher .” ; √ 分开: char s [20 ] ;

s = “I am a teacher .” ; ×

//因为 s 表示字符数组的首地址,是常量,不能在赋值号的左端,不能将字符串的首地址赋值给数组名;

(3) 再比较:

char s [20] ;

scanf ( “%s” , s ) ; √ 变换:char * ps ;

scanf ( “%s” , ps ) ; ×

// 错在 字符指针没有指向任何存储空间,不能给他输入字符串; 改成:char s [20] , * ps ; ps = s ;

scanf ( “%s” , ps ) ; √

//字符指针在没有指向一个确切的字符数组时,不能使用%s格式符,输入字符串;

2、字符串指针作函数参数:

传地址调用 实参 数组名 数组名 字符指针变量 字符指针变量 形参 数组名 字符指针变量 字符指针变量 数组名

基础练习(A)

一、选择题

1、已知:char str[]=\"OK!\";对指针变量ps的说明和初始化是( )。

A) char ps=str; B) char *ps=str; C) char ps=&str; D) char *ps=&str;

2、下面不正确的字符串赋值或赋初值的方式是( )。

A) char *str; str=\"string\";

B) char str[7]={'s','t','r','i','n','g'}; C) char str[10]; str=\"string\";

D) char str1[]=\"string\3、已知:char b[5],*p=b;则正确的赋值语句是 ( )。 A) b=\"abcd\"; B) *b=\"abcd\"; C) p=\"abcd\"; D) *p=\"abcd\"

4、已知:char s[20]=\"programming\则不能引用字母o的表达式是 ( )。 A) ps+2 B) s[2] C) ps[2] D) ps+=2,*ps 5、下列对字符串的定义中,错误的是( )。

A) char str[7]=\"FORTRAN\"; B) char str[]=\"FORTRAN\"; C) char *str=\"FORTRAN\";

D) char str[]={'F','O','R','T','R','A','N','\\0'};

6、已知:char c[8]=\"beijing\则下面的输出语句中,错误的是( )。

A) printf(\"%s\\n\C) for (i=0; i<7;i++) D) for (i=0; i<7; i++) printf(\"%c\

7、已知:char s1[4]=\"12\"; char *ptr;则执行下面语句后输出为 ( )。

ptr=s1;

printf(\"%c\\n\

A) 字符'2' B) 字符'1' C) 字符'2'的地址 D) 不确定 二、阅读程序,写出运行结果 1、# include main()

{ char a[]=\"language\"; char *ptr=a; while (*ptr!='\\0') { printf(\"%c\ptr++; } }

运行结果:

2、#include main()

{ char *str=\"abcde\"; printf(\"%c,\printf(\"%c,\printf(\"%c,\printf(\"%c,\printf(\"%c\\n\}

运行结果:

能力提高(B)

一、选择题

1、已知:char s[10],*p=s;则在下列语句中,错误的语句是 ( )。 A)p=s+5; B)s=p+s; C)s[2]=p[4]; D)*p=s[0];

2、已知:char s[100]; int i=10;则在下列引用数组元素的语句中,错误的表示是 ( )。 A)s[i+10] B)*(s+i) C)*(i+s) D)*((s++)+i

3、已知:int i; char *s=\"a\\045+045\\'b\";执行语句“for ( i=0; *s++; i++) ;”之后,变量i的结果是 ( )。

A)7 B)8 C)9 D)以上均是错误的 4、已知:char *s=\"a\\089+089\\'b\";则执行语句“for(i=0;*s++; i++);”之后,变量i的结果是( )。 A)7 B)8 C)9 D)1 二、填空题

1、已知:char *s1=\"abc\\\\\\\"de\则语句“printf(\"%s\%s\%s\\n\的结果是 。

2、若:char *s1=\"China\\\\\\bBeijing\\则语句“printf(\"%d,%d,%d\\n\的结果是 。 三、阅读程序,写出运行结果 1、# include # include main()

{ char *p1=\"abc\ strcpy(str+2,strcat(p1,p2)); printf(\"%s\\n\}

运行结果:( )

2、# include main()

{ char a[]=\"Program\for (ptr=a; ptrputchar (*ptr); }

运行结果:( )

3、# include main()

{ char a[]=\"language\"; char *ptr=a; while (*ptr)

{ printf(\"%c\ptr++; } }

运行结果:LANGUAGE

4、以下程序段的输出为 ( ) 。(选做)

static char a[]=\"Basic\"; char *ptr;

for (ptr=a; ptrA) Basic B) c C) B D) Basic asic ci a sic sic s ic asic I c Basic c

四、写出函数实现的功能 1、已知函数定义如下:

abcd ( char *s1,char *s2) { while (*s2++=*s1++); }

函数abcd的功能是 ( ) 。

A)串复制 B)求串长 C)串比较 D)串反向 2、已知函数定义如下:

int f(char *s) { char *p=s;

while (*p!='\\0') p++; return (p-s); }

函数f的功能是 ( )。

A)串比较 B)求串长 C)串复制 D)以上均不对 五、编程题

1、写一个函数,求一个字符串的长度。在主函数中输入字符串,并输出字符串长度,用指针法处理。

第5讲 知识归纳: 1、 指针数组:

(1) (1) 概念:一个数组,其元素均为指针类型数据,称为指针类型;

指针数组中的每一个元素都相当于一个指针变量; (2) (2) 格式:类型名 * 数组名 [ 常量 ] ;

如 : char * str[3 ] ={ “China”,”America”,”Canada”} ; //三个字符串的首地址依次放入 str[0] , str[1] , str[2] 中;

2、 指向指针的指针:

(1) (1) 概念:专门用来存放指针变量地址的指针变量,称为指向指针的指针; (2) (2) 定义格式: int a =5 ;

int * pa = & a ; int * * pp = &pa ;

printf ( “%d , %d , %d \\n” , a , *pa , **pp) ; 所以,a , *pa , **pp等价;

3、指针的总结和综合应用

基础练习(A)

一、选择题

1、已知:double *p[6];它的含义是( )。

A)p是指向duoble型变量的指针 B)p是double型数组 C)p是指针数组 D)p是数组指针

2、已知:char *aa[2]={\"abcd\则以下说法正确的是( )。

A)aa数组元素的值分别是\"abcd\"和\"ABCD\"

B)aa是指针变量,它指向含有两个数组元素的字符型一维数组

C)aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址 D)aa数组的两个元素中各自存放了字符'a'和'A'的地址 3、与定义“int *p[4]”等价的是( )。

A)int p[4] B)int *p C)int *(p[4]) D)int (*p)[4] 二、填空题 1、对于“int a[4];”可理解为数组a有4个元素,每个元素都是整型数据,那么,对于“int *a[4];”的理解就是数组a有4个元素,每个元素都是 ,又因为指针变量可指向与其同类型的变量,故每个元素都只能指向 变量。

2、访问变量的方式有两种: 和 ,指向指针的指针采用的是“二级间址”方法。现定义一个指向指针数据的指针变量,其基类型是字符型: 。

能力提高(B)

一、阅读程序,写出运行结果 1、# include main()

{ char *name[5],a1[20],a2[20],a3[20],a4[20],a5[20]; int i;

gets(a1); gets(a2); gets(a3); gets(a4); gets(a5);

name[0]=a1; name[1]=a2; name[2]=a3; name[3]=a4; name[4]=a5; for (i=0; i<5; i++)

printf(\"%s\\n\}

运行程序,输入:aababcabcdabcde表示回车) 运行结果:

2、# include main()

{ char *name[5]={\"Follow me\

char **p=name; int i;

for (i=0; i<5; i++) printf(\"%s\\n\}

运行结果:

3、main()

{ int a[5]={2,4,6,8,10},*p,**k; p=a; k=&p;

printf(\"%d\printf(\"%d\\n\}

运行结果:

二、程序填空(选做)

1、下面程序完成的功能是对一批程序设计语言名从小到大进行排序并输出。

# include # include

sort ( char *book[], int num) { int i,j;

char *temp;

for (j=1; j<=num-1; j++ ) for (i=0; ; i++ ) if (strcmp(book[i],book[i+1])>0) { temp=book[i]; book[i]=book[i+1]; book[i+1]=temp; } }

main() { int i;

char *book[]={\"FORTRAN\sort( );

for ( i=0; i<6; i++ ) printf(\"%s\\n\}

链接二级考试

一、一、选择题

1、 若有以下调用语句,则不正确的fun函数的首部是( )。 A) void fun(int m, int x[]) B) void fun(int s, int h[41]) C) void fun(int p, int *s) D) void fun(int n, int a) main() { „

int a[50],n; „

fun(n, &a[9]); „

} (2000年4月)

2、 设已有定义: char *st=\"how are you\"; 下列程序段中正确的是( ) 。

A) char a[11], *p; strcpy(p=a+1,&st[4]); B) char a[11]; strcpy(++a, st); C) char a[11]; strcpy(a, st);

D) char a[], *p; strcpy(p=&a[1],st+2); (2000年4月)

3、 有如下说明

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; 则数值为9的表达式是( )。 A) *P+9 B) *(P+8) C) *P+=9 D) P+8 (2000年9月)

4、 有如下程序

main()

{ char s[]=”ABCD”, *P;

for(p=s+l; p该程序的输出结果是( ) 。

A) ABCD B) A C) B D) BCD BCD B C CD CD C D D D D

(2000年9月)

5、 有如下程序

main()

{ char ch[2][5]={“6937”,”8254”},*p[2];

int i,j,s=0;

for(i=0;i<2;i++) p[i]=ch[i]; for(i=0;i<2;i++)

for(j=0;p[i][j]>‟\\0‟;j+=2)

s=10*s+p[i][j]-„0‟;

printf(“%d\\n”,s); }

该程序的输出结果是( )。

A) 69825 B) 63825 C) 6385 D) 693825 (2000年9月)

6、 下列程序段的输出结果是( ) 。

A) 2 1 4 3 B) 1 2 1 2 C) 1 2 3 4 D) 2 1 1 2

void fun(int *x, int *y)

{ printf(“%d , %d”, *x, *y); *x=3; *y=4;} main()

{ int x=1,y=2; fun(&x,&y);

printf(“%d %d”,x, y); }

(2001年4月) 7、 下列程序的输出结果是( )。

A) 非法 B)a[4]的地址 C)5 D)3

main()

{ char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5; printf(“%d”,*--p); } (2001年4月)

8、 下列程序的运行结果是( )。

A) 6 3 B) 3 6 C) 编译出错 D) 0 0

void fun(int *a, int *b) { int *k;

k=a; a=b; b=k; }

main()

{ int a=3, b=6, *x=&a, *y=&b; fun(x,y);

printf(“%d %d”, a, b); } (2001年4月) 9、 下面程序的输出结果是( )。

A) 0 B) 1 C) 10

main()

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

printf(“%d\\n”,*p+9); } (2001年4月)

D) 9

10、 以下程序的输出结果是( ) 。

char cchar(char ch) {

if(ch>=‘A’&&ch<=‘Z') ch=ch-‘A'+‘a'; return ch; }

main()

{ char s[]=\"ABC+abc=defDEF\

while(*p)

{ *p=cchar(*p); p++; }

printf(\"%s\\n\}

A) abc+ABC=DEFdef B) abc+abc=defdef C) abcaABCDEFdef D) abcabcdefdef (2002年4月) 11、 以下程序调用findmax函数返回数组中的最大值( ) 。

findmax(int *a,int n) { int *p,*s;

for(p=a,s=a; p-amain()

{ int x[5]={12,21,13,6,18}; printf(\"%d\\n\}

在下划线处应填入的是

A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s (2002年4月) 12、 若有以下定义和语句:

int s[4][5],(*ps)[5];

ps=s;

则对s数组元素的正确引用形式是( )。

A) ps+1 B) *(ps+3) C) ps[0][2] D) *(ps+1)+3 (2002年4月) 13、 以下程序的输出结果是( ) 。

#include #include main()

{ char b1[8]=\"abcdefg\while (--pb>=b1) strcpy(b2,pb); printf(\"%d\\n\} A) 8 B) 3 C) 1 D) 7 (2002年4月)

14、 若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是( )。

A) p=q; B) *p=*q; C) n=*q; D) p=n; (2002年9月) 15、 有以下程序

void fun(char *c,int d) { *c=*c+1;d=d+1; printf(“%c,%c,”,*c,d); }

main()

{ char a=‟A‟,b=‟a‟;

fun(&b,a); printf(“%c,%c\\n”,a,b); }

程序运行后的输出结果是( )。

A)B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b (2002年9月) 16、 有以下程序

#include main()

{ char *p=“abcde\\Ofghjik\\0”; printf(“%d\\n”,strlen(p)); }

程序运行后的输出结果是( ) 。

A) 12 B) 15 C) 6 (2002年9月) 17、 有以下程序

void ss(char *s,char t) { while(*s)

{ if(*s==t) *s=t-„a‟+‟A‟; s++; } }

main()

{ char str1[100]=“abcddfefdbd”,c=‟d‟; ss(str1,c); printf(“%s\\n”,str1); }

D) 5

程序运行后的输出结果是( ) 。

A) ABCDDEFEDBD C) abcAAfefAbA (2002年9月)

B) abcDDfefDbD D) Abcddfefdbd

18、有以下程序

int *f(int *x,int *y) { if(*x<*y) return x; else return y; }

main()

{ int a=7,b=8,*p,*q,*r}; }

执行后输出结果是( )。 A) 7,8,8 B) 7,8,7 (2003年4月)

C) 8,7,7 D) 8,7,8

19、有以下程序

main()

{ char *s[]={\"one\ p=s[1];

printf(\"%c,%s\\n\}

执行后输出结果是( )。

A) n,two B) t,one (2003年4月) 20、有以下程序

main()

{ int x[8]={8,7,6,5,0,0},*s; s=x+3

printf(\"%d\\n\}

执行后输出结果是( ) 。 A) 随机值 B) 0 (2003年4月)

C)w,one D) o,two

C) 5 D) 6

21、 阅读以下函数

fun(char *s1,char *s2) { int i=0;

while(s1[i]==s2[i]&& s2[i]!=„\\0‟)i++; return(s1[i]== && s2{i}!==„\\0‟); }

此函数的功能是( ) 。 A) 将s2所指字符串赋给s1

B) 比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0 C) 比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为0

D) 比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为0 (2003年4月) 22、 有以下程序

void fun(char *a, char *b) { a=b; (*a)++; }

main ()

{ char c1=\"A\p1=&c1; p2=&c2; fun(p1,p2); printf(“&c&c\\n”,c1,c2); }

程序运行后的输出结果是( ) 。 A) Ab B) aa C) Aa D) Bb (2003年9月)

23、 若程序中已包含头文件stdio.h, 以下选项中,正确运用指针变量的程序段是( )。

A) t *i=NULL; B) float *f=NULL; scanf(\"&d\

C) char t=\"m\*c=&t; L=„\\0‟; (2003年9月) 24、 有以下程序段

main()

{ int a=5, *b, **c; c=&b; b=&a; …… }

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

A) 变量a的地址 B) 变量b中的值 C) 变量a中的值 D) 变量b的地址 (2003年9月) 25、 已定义以下函数

fun(char *p2, char *p1)

{ while((*p2=*p1)!=„\\0‟){p1++;p2++; } } 函数的功能是( )。

A) 将p1所指字符串复制到p2所指内存空间 B) 将p1 所指字符串的地址赋给指针 p2 C) 对p1和p2两个指针所指字符串进行比较

D) 检查p1和p2两个指针所指字符串中是否有‘\\0’ (2003年9月) 二、二、填空题

1、 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的

字符串为:556,则输出十进制整数366。请填空。 #include main()

{ char *p, s[6]; int n; p=s; gets(p); n=*p-'0';

while(__________!='\\0')n=n*8+*p-'0'; printf(\"%d \\n\} (2000年4月)

2、下列程序的输出结果是 。

void fun(int *n) { while( (*n)--);

printf(“%d”,++(*n)); }

main()

{ int a=100;

fun(&a);

} (2001年4月)

3、以下程序的输出结果是 。

main()

{ int arr[ ]={30,25,20,15,10,5}, *p=arr; p++;

printf(“%d\\n”,*(p+3)); } (2001年4月) 4、 设有以下程序:

main()

{ int a, b, k=4, m=6, *p1=&k, *p2=&m;

a=pl==&m;

b=(*p1)/(*p2)+7; printf(“a=%d\\n”,a); printf(“b=%d\\n”,b); }

执行该程序后,a的值为 ,b的值为 。 (2001年9月)

5、 以下程序运行后的输出结果是 。

main()

{ char s[ ]=“9876”,*p;

for ( p=s ; p(2001年9月) 6、 以下程序的输出结果是 。

main()

{ char *p=\"abcdefgh\long *q; q=(long*)p; q++;

r=(char*)q; printf(\"%s\\n\}

(2002年4月) 7、 以下程序的输出结果是 。

main() { int x=0;

sub(&x,8,1); printf(\"%d\\n\}

sub(int *a,int n,int k) { if(k<=n) sub(a,n/2,2*k); *a+=k;

} (2002年4月) 8、下面程序的运行结果是: 。

void swap(int *a,int *b) { int *t;

t=a; a=b; b=t; }

main()

{ int x=3,y=5,*p=&x,*q=&y; swap(p,q);

printf(“%d%d\\n”,*p,*q); } (2002年9月)

因篇幅问题不能全部显示,请点此查看更多更全内容