1、C经典指针习题指针本章重要知识点:1. 一个变量的地址称为该变量的指针。指针变量定义的一般形式为: 类型标识符 *变量名int *i_point;2. * 在定义语句中只表示变量的类型是指针,没有任何计算意义。 * 在语句中表示“指向”。&表示“地址”。3. 指针变量只能存放地址,不要将非地址数据赋给指针变量。 int *p; p=100; 4. +, - -, * 优先级相同,都是右结合性。int a=3, *p; p=&a;(1)(*p)+; 相当于a+。表达式为3, a=4 (2)*p+; *(p+)首先*p ,然后p=p+1,指针指向下一个int单元 表达式为3, (3)+*p +(*
2、p) *p=*p+1 a=4 (4)*+p *(+p),首先:p=p+1, 然后取*p。即取p所指的下一个int单元的内容。5. 指针变量作为函数参数 (1)函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。 (2)指针变量作为函数参数与变量本身作函数参数不同,变量作函数参数传递的是具体值,而指针作函数参数传递的是内存的地址。 (3)用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,这样,函数在调用结束后,其变化值才能保留回主调函数。 (4)函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。 (5)用指针变量作函数参数
3、,可以得到多个变化了的值。注意:如果函数的形参是指针类型,那么实参传递过去的一定是地址(二级上机改错题必考类型)6. 数组的指针和指向数组的指针变量数组名就是数组的起始地址;又规定:数组的指针就是数组的起始地址。数组元素的指针就是数组元素的地址。(1)指向数组元素的指针变量的定义与赋值 int a10, *p; p=a; (2) p+1指向数组的下一个元素,而不是下一个字节7. 数组名作函数参数(重点,难点)(1) 数组名可以作函数的实参和形参,传递的是数组的地址。这样,实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调函数内。(2) 在函数调用时,形参数组并没有
4、另外开辟新的存储单元,而是以实参数组的首地址作为形参数组的首地址。这样形参数组的元素值发生了变化也就使实参数组的元素值发生了变化。8. 指向二维数组的指针和指针变量int a34; (1) a为二维数组名,a+1为a1的地址,也就是数组第一行的地址,所以a为行指针。a为行指针,加1移动一行。(2) a1为一维数组名,a1+1为a11的地址,也就是数组第一行第一列的地址, 所以a1为列指针。(3) *a或a0为列指针,加1移动一列(4) a, a+0 , *(a+0), a0, &a00表示的都是二维数组的首地址。 (5) 注意二维数组的各种表示法,a为常量。*(a+i)与ai等价9 指向由m个
5、整数组成的一维数组的指针变量,int (*p)m; 注意,p为行指针,可以直接将二维数组名a赋给p。这样,a与p等同。如有anm,可以令p=a;10. 字符串的指针和指向字符串的指针变量(1) char string =“I love China”;(合法,string为数组名,代表数组的首地址,是常量。)(2) char string20;string=I love China;(非法表示,常量不能赋值)正确的写法:strcpy(string, I love China);(3) 用字符指针表示字符串 char *string=“I love China”;(合法,将内存中字符串常量的首地址
6、赋给一个指针变量) 另一种写法:char *string; string=“I love China”;(指针变量赋值,合法) 第3种写法:char *string; gets(string);(非法,指针未赋值就作指向运算)11. 函数的指针和指向函数的指针变量(1)函数在编译时被分配给一个入口地址。这个入口地址就称为函数的地址,也是函数的指针。像数组一样,C语言规定,函数名就代表函数的入口地址(2) 专门存放函数地址的指针变量称为指向函数的指针变量 函数类型 (*指针变量名)(参数类型 ); int (*p)( int, int); int max (int x, int y) retur
7、n xy?x:y; p=max;( 这时,指针变量p中放的是max函数在内存中的入口地址。)12. 返回指针值的函数(1) 被调函数返回的不是一个数据,而是一个地址。所以函数的类型为指针类型。 类型标识符 *函数名(参数表)13. 指针数组和指向指针的指针(1) 指针数组中的每一个元素都是指针变量,可以放地址。 类型标识 *数组名数组长度说明 int *p4; p为数组名,内有四个元素,每个元素可以放一个int型数据的地址 (2) 指向指针的指针变量(或称为二级指针)int i,*p; p=&i;同样,p也有地址,可以再引用一个指针变量指向它。prt=&p; 称prt为指向指针的指针变量。其基
8、类型是指向整型数据的指针变量,而非整型数据。总结:(1) 指针变量可以有空值,即指针变量不指向任何地址 p=NULL(2) 两指针可以相减,不可相加。若要进行相减运算,则两指针必须指向同一数组,相减结果为相距的数组元素个数(3) 指向同一数组的两个指针变量可以比较大小(4) 通过行指针引用二维数组元素(本章的难点,重点)int a34, *p3, (*pp)4, *prt;for(i=0;i3;i+) pi=ai;pp=a;prt=p;(1)a:二维数组名,常量(2)p:指针数组名,常量(3)pp:指向具有四个元素的一维数组的指针变量(4)prt :指向指针的指针变量本章习题(1)有以下程序
9、main() int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r; coutmn*p*q; 程序运行后的输出结果是 A)1,2,1,2 B)1,2,2,1 C)2,1,2,1 D)2,1,1,2(2)若有定义语句:int a410,*p,*q4;且0i4,则错误的赋值是 A)p=a B)qi=ai C)p=ai D)p=&a21(3)有以下程序 #include #include main() char str 20=“One*World”, “One*Dream!”,*p=str1; coutstrlen(p)c C)c=getchar(); D)*c=”stri
10、ng”;(7)有以下程序 main() char *s=ABC; do cout*s%10);s+; while (*s);注意:字母A的ASCII码值为65。程序运行后的输出结果是A)5670B)656667C)567D)ABC(8)有以下程序 void fun(char *s) while(*s) if (*s%2=0) cout*s; s+; main() char a=good; fun(a); 注意:字母a的ASCII码值为97,程序运行后的输出结果是A)dB)goC)godD)good(9)有以下程序void fun(int *a,int *b) int *c; c=a;a=b;b
11、=c;main() int x=3,y=5,*p=&x,*q=&y; fun(p,q); cout*p*q; fun(&x,&y); cout*p*q;程序运行后输出的结果是A)3,5,5,3 B)3,5,3,5 C)5,3,3,5 D)5,3,5,3(10)有以下程序 void f(int *p,int *q);main() int m=1,n=2,*r=&m; f(r,&n); coutmn;void f(int *p,int *q)p=p+1;*q=*q+1;程序运行后的输出结果是A)1,3B)2,3C)1,4D)1,2(11)以下函数按每行8个输出数组中的数据 void fun(int
12、 *w,int n) int i; for(i=0;in;i+) _ coutwi; 下划线出应填入的语句是A)if(i/8=0) coutendl;B)if(i/8=0) continue;C)if(i%8=0) coutendl;D)if(i%8=0) continue;(12)若有以下定义int x10,*pt=x;则对数组元素的正确引用是A)*&x10B)*(x+3)C)*(pt+10)D)pt+3(13)有以下程序 main() char *a=abcd,ef,gh,ijk;int i; for(i=0;i4;i+) cout*ai);程序运行后的输出结果是A)aegiB)dfhkC
13、)dfhkD)abcdefghijk(14)以下选项中正确的语句组是A)char s;s=BOOK!;B)char *s;s=BOOK!;C)char s10;s=BOOK!;D)char *s;s=BOOK!;(15)有以下程序 int b=2;int fun(int *k) b=*k+b;return (b);main() int a10=1,2,3,4,5,6,7,8,i;for(i=2;i4;i+) b=fun(&ai)+b; coutb;程序运行后的输出结果是A)10 12B)8 10C)10 28D)10 16(16)若有定义语句:double x5=, *p=x;则错误引用x 数
14、组元素的是( )。A)*p B)x5 C)*(p+1) D)*x(17)有以下程序 #include int fun(int n) int *p;p=(int*)malloc(sizeof(int);*p=n; return *p;main() int a;a = fun(10); couta+fun(10);程序的运行结果是( )。A)0 B)10 C)20 D)出错(18)有以下程序 int fun(int (*s)4,int n, int k) int m, i;m=s0k;for(i=l; im) m=sik;return m;main() int a44=1,2,3,4),11,12
15、,13,14,2l,22,23,24,31,32,33,34;cout fun(a,4,0);程序的运行结果是( )。A)4 B)34 C)31 D)32(19)以下程序的输出结果是_ 。 main() int j, a=1,3,5,7,9,11,13,15,*p=a+5;for(j=3; j; j-) switch(j) case 1:case 2: cout*p+; break;case 3: cout*(-p);(20)以下程序的输出结果是 _ 。 #define N 5int fun(int *s, int a, int n) int j;*s=a; j=n;while(a!=sj)j
16、-;return j;main() int sN+1; int k;for(k=l; k=N; k+) sk=k+l;coutfun(s,4,N);(21)有以下程序 main()int a=1,2,3,4,y,*p=&a3;-p; y=*p; couty= y;程序的运行结果是( )。A)y=0 B)y=1C)y=2 D)y=3(22)设有如下程序段char s20= Beijing, *p;p=s;则执行p=s;语句后,以下叙述正确的是( )。A)可以用*p 表示s0B)s 数组中元素的个数和p 所指字符串长度相等C)s 和p 都是指针变量D)数组s 中的内容和指针变量p 中的内容相同(2
17、3)有以下程序 #include void fun(char *s,int n)char *t;int i,j;for(i=0;in-1;i+)for(j=i+1;jstrlen(sj) t=si;si=sj;sj=t;main()char *ss=bcc,bbcc,xy,aaaacc,aabcc;fun(ss,5); coutss0ss4;程序的运行结果是( )。A)xy,aaaacc B)aaaacc,xyC)bcc,aabcc D)aabcc,bcc(24)有以下程序 void fun(char *a,char *b)while(*a=*)a+;while(*b=*a)b+;a+;mai
18、n()char *s=*a*b*,t80;fun(s,t);puts(t);程序的运行结果是( )。A)*a*b B)a*bC)a*b* D)ab(25)设有定义语句int (*f)(int);,则以下叙述正确的是( )。A)f 是基类型为int 的指针变量B)f 是指向函数的指针变量,该函数具有一个int 类型的形参C)f 是指向int 类型一维数组的指针变量D)f 是函数名,该函数的返回值是其类型为int 类型的地址(26)以下程序的输出结果是 _。void swap(int *a,int *b)int *t;t=a;a=b;b=t;main()int i=3,j=5,*p=&i,*q=&
19、j;swap(p,q); cout*p*q;(27)以下程序的输出结果是_ 。 main()int a5=2,4,6,8,10,*p;p=a;p+;cout*p; (29)设有定义:char p =1, 2, 3, *q=p;,下列不能计算出一个char 型数据所占字节数的表达式是( )。A)sizeof(p) B)sizeof(char)C)sizeof(*q) D)sizeof(p0)(30) 有下列函数:int aaa(char *s) char *t=s;while( *t+ +);t - -;return(t-s);下列关于aaa 函数的功能的叙述正确的是( )。A)求字符串s 的长
20、度 B)比较两个串的大小C)将串s 复制到串t D)求字符串s 所占字节数(31)有下列程序: void fun(char * *p) + +p; cout*p;main( ) char *a =(Morning,Afternoon,Evening,Night);fun(a);程序的运行结果是( )。A)Afternoon B)fternoon C)Morning D)orning(32)若有定义语句:int a23,*p3;,则下列语句中正确的是( )。A)p=a; B)p0=a;C)p0=&a12; D)p1=&a;(33)有下列程序: void fun(int *a,int n)/*fu
21、n 函数的功能是将a 所指数组元素从大到小排序*/ int t,i,j;for(i=0;in-1;j+ +)for(j=i+1;jn;j+ +)if(aiaj) t=ai;ai=aj;aj=t;main( ) int c10=1,2,3,4,5,6,7,8,9,0,i;fun(c+4,6);for(i=0;i10;i+ +) coutci;程序的运行结果是( )。A)1,2,3,4,5,6,7,8,9,0, B)0,9,8,7,6,5,1,2,3,4,C)0,9,8,7,6,5,4,3,2,1, D)1,2,3,4,9,8,7,6,5,0,(34)有下列程序: int fun(char s )
22、 int n=0;while(*s=0) n=10*n+*s-0;s+ +;return(n);main( ) char s10=6,1,*,4,*,9,*,0,*;coutfun(s);程序的运行结果是( )。A)9 B)61490 C)61 D)5(35)有下列程序: void fun(char *t,char *s) while(*t! =0) t+ +;while(*t+ + =*s+ +)! =0);main( ) char ss10=acc,aa10=bbxxyy;fun(ss,aa); coutssaa;程序的运行结果是( )。A)accxyy,bbxxyy B)acc,bbxx
23、yyC)accxxyy,bbxxyy D)accbbxxyy,bbxxyy(36)有下列程序: void fun(int n,int *p) int f1,f2;if(n= =1|n= =2) *p=1;else fun(n-1,&f1); fun(n-2,&f2);*p=f1+f2;main( ) int s;fun(3,&s); couts;程序的运行结果是( )。A)2 B)3 C)4 D)5(37)下列程序的输出结果是 _ 。 #include char *fun(char *t) char *p=t;return (p+strlen(t)/2); main( ) char *str=abcdefgh;str=fun(str);puts(str);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1