C经典指针习题.docx
《C经典指针习题.docx》由会员分享,可在线阅读,更多相关《C经典指针习题.docx(20页珍藏版)》请在冰豆网上搜索。
C经典指针习题
指针
本章重要知识点:
1.一个变量的地址称为该变量的指针。
指针变量定义的一般形式为:
类型标识符*变量名
int*i_point;
2.*在定义语句中只表示变量的类型是指针,没有任何计算意义。
*在语句中表示“指向”。
&表示“地址”。
3.指针变量只能存放地址,不要将非地址数据赋给指针变量。
int*p;p=100;
4.++,--,*优先级相同,都是右结合性。
inta=3,*p;p=&a;
(1)(*p)++;相当于a++。
表达式为3,a=4
(2)*p++;*(p++)首先*p,然后p=p+1,指针指向下一个int单元表达式为3,
(3)++*p++(*p)*p=*p+1a=4
(4)*++p*(++p),首先:
p=p+1,然后取*p。
即取p所指的下一个int单元的内容。
5.指针变量作为函数参数
(1)函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。
(2)指针变量作为函数参数与变量本身作函数参数不同,变量作函数参数传递的是具体值,而指针作函数参数传递的是内存的地址。
(3)用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,这样,函数在调用结束后,其变化值才能保留回主调函数。
(4)函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。
(5)用指针变量作函数参数,可以得到多个变化了的值。
注意:
如果函数的形参是指针类型,那么实参传递过去的一定是地址(二级上机改错题必考类型)
6.数组的指针和指向数组的指针变量
数组名就是数组的起始地址;又规定:
数组的指针就是数组的起始地址。
数组元素的指针就是数组元素的地址。
(1)指向数组元素的指针变量的定义与赋值
inta[10],*p;p=a;
(2)p+1指向数组的下一个元素,而不是下一个字节
7.数组名作函数参数(重点,难点)
(1)数组名可以作函数的实参和形参,传递的是数组的地址。
这样,实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调函数内。
(2)在函数调用时,形参数组并没有另外开辟新的存储单元,而是以实参数组的首地址作为形参数组的首地址。
这样形参数组的元素值发生了变化也就使实参数组的元素值发生了变化。
8.指向二维数组的指针和指针变量
inta[3][4];
(1)a为二维数组名,a+1为a[1]的地址,也就是数组第一行的地址,所以a为行指针。
a为行指针,加1移动一行。
(2)a[1]为一维数组名,a[1]+1为a[1][1]的地址,也就是数组第一行第一列的地址,所以a[1]为列指针。
(3)*a或a[0]为列指针,加1移动一列
(4)a,a+0,*(a+0),a[0],&a[0][0]表示的都是二维数组的首地址。
(5)注意二维数组的各种表示法,a为常量。
*(a+i)与a[i]等价
9指向由m个整数组成的一维数组的指针变量,int(*p)[m];
注意,p为行指针,可以直接将二维数组名a赋给p。
这样,a与p等同。
如有a[n][m],可以令p=a;
10.字符串的指针和指向字符串的指针变量
(1)charstring[]=“IloveChina”;(合法,string为数组名,代表数组的首地址,是常量。
)
(2)charstring[20];
string="IloveChina";(非法表示,常量不能赋值)
正确的写法:
strcpy(string,"IloveChina");
(3)用字符指针表示字符串
char*string=“IloveChina”;(合法,将内存中字符串常量的首地址赋给一个指针变量)
另一种写法:
char*string;string=“IloveChina”;(指针变量赋值,合法)
第3种写法:
char*string;gets(string);(非法,指针未赋值就作指向运算)
11.函数的指针和指向函数的指针变量
(1)函数在编译时被分配给一个入口地址。
这个入口地址就称为函数的地址,也是函数的指针。
像数组一样,C语言规定,函数名就代表函数的入口地址
(2)专门存放函数地址的指针变量称为指向函数的指针变量
函数类型(*指针变量名)(参数类型);
int(*p)(int,int);
intmax(intx,inty)
{returnx>y?
x:
y;}
p=max;(这时,指针变量p中放的是max函数在内存中的入口地址。
)
12.返回指针值的函数
(1)被调函数返回的不是一个数据,而是一个地址。
所以函数的类型为指针类型。
类型标识符*函数名(参数表)
13.指针数组和指向指针的指针
(1)指针数组中的每一个元素都是指针变量,可以放地址。
类型标识*数组名[数组长度说明]
int*p[4];
p为数组名,内有四个元素,每个元素可以放一个int型数据的地址
(2)指向指针的指针变量(或称为二级指针)
inti,*p;p=&i;
同样,p也有地址,可以再引用一个指针变量指向它。
prt=&p;
称prt为指向指针的指针变量。
其基类型是指向整型数据的指针变量,而非整型数据。
总结:
(1)指针变量可以有空值,即指针变量不指向任何地址
p=NULL
(2)两指针可以相减,不可相加。
若要进行相减运算,则两指针必须指向同一数组,相减结果为相距的数组元素个数
(3)指向同一数组的两个指针变量可以比较大小
(4)通过行指针引用二维数组元素(本章的难点,重点)
inta[3][4],*p[3],(*pp)[4],**prt;
for(i=0;i<3;i++)
p[i]=a[i];
pp=a;
prt=p;
(1)a:
二维数组名,常量
(2)p:
指针数组名,常量
(3)pp:
指向具有四个元素的一维数组的指针变量
(4)prt:
指向指针的指针变量
本章习题
(1)有以下程序
main()
{intm=1,n=2,*p=&m,*q=&n,*r;
r=p;p=q;q=r;
cout<}
程序运行后的输出结果是
A)1,2,1,2
B)1,2,2,1
C)2,1,2,1
D)2,1,1,2
(2)若有定义语句:
inta[4][10],*p,*q[4];且0≤i<4,则错误的赋值是
A)p=a
B)q[i]=a[i]
C)p=a[i]
D)p=&a[2][1]
(3)有以下程序
#include<>
#include<>
main()
{charstr[][20]={“One*World”,“One*Dream!
”},*p=str[1];
cout<}
程序运行后的输出结果是
A)9,One*World
B)9,One*Dream
C)10,One*Dream!
D)10,One*World
(4)下列函数的功能是
fun(char*a,char*b)
{while((*b=*a)!
=’\0’){a++,b++;}}
A)将a所指字符串赋给b所指空间
B)使指针b指向a所指字符串
C)将a所指字符串和b所指字符串进行比较
D)检查a和b所指字符串中是否有’\0’
(5)设有以下函数
voidfun(intn,char*s){……}
则下面对函数指针的定义和赋值均是正确的是
A)void(*pf)();pf=fun;
B)viod*pf();pf=fun;
C)void*pf();*pf=fun;
D)void(*pf)(int,char*);pf=fun;
(6)设有定义:
char*c;,以下选项中能够使字符型指针c正确指向一个字符串的是
A)charstr[]=”string”;c=str;
B)cin>>c
C)c=getchar();
D)*c=”string”;
(7)有以下程序
main()
{char*s="ABC";
do
{cout<<*s%10);s++;
}
while(*s);
}
注意:
字母A的ASCII码值为65。
程序运行后的输出结果是
A)5670
B)656667
C)567
D)ABC
(8)有以下程序
voidfun(char*s)
{while(*s)
{if(*s%2==0)cout<<*s;
s++;
}
}
main()
{chara[]={"good"};
fun(a);}
注意:
字母a的ASCII码值为97,程序运行后的输出结果是
A)d
B)go
C)god
D)good
(9)有以下程序
voidfun(int*a,int*b)
{int*c;
c=a;a=b;b=c;
}
main()
{intx=3,y=5,*p=&x,*q=&y;
fun(p,q);cout<<*p<<*q;
fun(&x,&y);cout<<*p<<*q;
}
程序运行后输出的结果是
A)3,5,5,3B)3,5,3,5C)5,3,3,5D)5,3,5,3
(10)有以下程序
voidf(int*p,int*q);
main()
{intm=1,n=2,*r=&m;
f(r,&n);cout<}
voidf(int*p,int*q)
{p=p+1;*q=*q+1;}
程序运行后的输出结果是
A)1,3
B)2,3
C)1,4
D)1,2
(11)以下函数按每行8个输出数组中的数据
voidfun(int*w,intn)
{inti;
for(i=0;i{____________
cout<}
}
下划线出应填入的语句是
A)if(i/8==0)cout<B)if(i/8==0)continue;
C)if(i%8==0)cout<D)if(i%8==0)continue;
(12)若有以下定义
intx[10],*pt=x;
则对数组元素的正确引用是
A)*&x[10]
B)*(x+3)
C)*(pt+10)
D)pt+3
(13)有以下程序
main()
{char*a[]={"abcd","ef","gh","ijk"};inti;
for(i=0;i<4;i++)cout<<*a[i]);
}
程序运行后的输出结果是
A)aegi
B)dfhk
C)dfhk
D)abcdefghijk
(14)以下选项中正确的语句组是
A)chars[];s="BOOK!
";
B)char*s;s={"BOOK!
"};
C)chars[10];s="BOOK!
";
D)char*s;s="BOOK!
";
(15)有以下程序
intb=2;
intfun(int*k)
{b=*k+b;return(b);}
main()
{inta[10]={1,2,3,4,5,6,7,8},i;
for(i=2;i<4;i++){b=fun(&a[i])+b;cout<
}
程序运行后的输出结果是
A)1012
B)810
C)1028
D)1016
(16)若有定义语句:
doublex[5]={,,,,},*p=x;则错误引用x数组元素的是
()。
A)*pB)x[5]C)*(p+1)D)*x
(17)有以下程序
#include<>
intfun(intn)
{int*p;
p=(int*)malloc(sizeof(int));
*p=n;return*p;
}
main()
{inta;
a=fun(10);cout<}
程序的运行结果是()。
A)0B)10C)20D)出错
(18)有以下程序
intfun(int(*s)[4],intn,intk)
{intm,i;
m=s[0][k];
for(i=l;im)m=s[i][k];
returnm;
}
main()
{inta[4][4]={{1,2,3,4),{11,12,13,14},{2l,22,23,24},{31,32,33,34}};
cout<}
程序的运行结果是()。
A)4B)34C)31D)32
(19)以下程序的输出结果是____________。
main()
{intj,a[]={1,3,5,7,9,11,13,15},*p=a+5;
for(j=3;j;j--)
{switch(j)
{case1:
case2:
cout<<*p++;break;
case3:
cout<<*(--p);
}
}
}
(20)以下程序的输出结果是___________。
#defineN5
intfun(int*s,inta,intn)
{intj;
*s=a;j=n;
while(a!
=s[j])j--;
returnj;
}
main()
{ints[N+1];intk;
for(k=l;k<=N;k++)s[k]=k+l;
cout<}
(21)有以下程序
main()
{inta[]={1,2,3,4},y,*p=&a[3];
--p;y=*p;cout<<"y="<}
程序的运行结果是()。
A)y=0B)y=1
C)y=2D)y=3
(22)设有如下程序段
chars[20]="Beijing",*p;
p=s;
则执行p=s;语句后,以下叙述正确的是()。
A)可以用*p表示s[0]
B)s数组中元素的个数和p所指字符串长度相等
C)s和p都是指针变量
D)数组s中的内容和指针变量p中的内容相同
(23)有以下程序
#include""
voidfun(char*s[],intn)
{
char*t;inti,j;
for(i=0;ifor(j=i+1;jif(strlen(s[i])>strlen(s[j])){t=s[i];s[i]=s[j];s[j]=t;}
}
main()
{
char*ss[]={"bcc","bbcc","xy","aaaacc","aabcc"};
fun(ss,5);cout<}
程序的运行结果是()。
A)xy,aaaaccB)aaaacc,xy
C)bcc,aabccD)aabcc,bcc
(24)有以下程序
voidfun(char*a,char*b)
{
while(*a=='*')a++;
while(*b=*a){b++;a++;}
}
main()
{
char*s="*****a*b****",t[80];
fun(s,t);puts(t);
}
程序的运行结果是()。
A)*****a*bB)a*b
C)a*b****D)ab
(25)设有定义语句int(*f)(int);,则以下叙述正确的是()。
A)f是基类型为int的指针变量
B)f是指向函数的指针变量,该函数具有一个int类型的形参
C)f是指向int类型一维数组的指针变量
D)f是函数名,该函数的返回值是其类型为int类型的地址
(26)以下程序的输出结果是__________。
voidswap(int*a,int*b)
{
int*t;
t=a;a=b;b=t;
}
main()
{
inti=3,j=5,*p=&i,*q=&j;
swap(p,q);cout<<*p<<*q;
}
(27)以下程序的输出结果是___________。
main()
{
inta[5]={2,4,6,8,10},*p;
p=a;p++;
cout<<*p;
}
(29)设有定义:
charp[]={'1','2','3'},*q=p;,下列不能计算出一个char型数据所占字节数
的表达式是()。
A)sizeof(p)B)sizeof(char)
C)sizeof(*q)D)sizeof(p[0])
(30)有下列函数:
intaaa(char*s)
{char*t=s;
while(*t++);
t--;
return(t-s);
}
下列关于aaa函数的功能的叙述正确的是()。
A)求字符串s的长度B)比较两个串的大小
C)将串s复制到串tD)求字符串s所占字节数
(31)有下列程序:
voidfun(char**p)
{++p;cout<<*p;}
main()
{char*a[]=("Morning","Afternoon","Evening","Night");
fun(a);
}
程序的运行结果是()。
A)AfternoonB)fternoonC)MorningD)orning
(32)若有定义语句:
inta[2][3],*p[3];,则下列语句中正确的是()。
A)p=a;B)p[0]=a;
C)p[0]=&a[1][2];D)p[1]=&a;
(33)有下列程序:
voidfun(int*a,intn)/*fun函数的功能是将a所指数组元素从大到小排序*/
{intt,i,j;
for(i=0;ifor(j=i+1;jif(a[i]}
main()
{intc[10]={1,2,3,4,5,6,7,8,9,0},i;
fun(c+4,6);
for(i=0;i<10;i++)cout<}
程序的运行结果是()。
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)有下列程序:
intfun(chars[])
{intn=0;
while(*s<='9'&&*s>='0'){n=10*n+*s-'0';s++;}
return(n);
}
main()
{chars[10]={'6','1','*','4','*','9','*','0','*'};
cout<}
程序的运行结果是()。
A)9B)61490C)61D)5
(35)有下列程序:
voidfun(char*t,char*s)
{while(*t!
=0)t++;
while((*t++=*s++)!
=0);
}
main()
{charss[10]="acc",aa[10]="bbxxyy";
fun(ss,aa);cout<}
程序的运行结果是()。
A)accxyy,bbxxyyB)acc,bbxxyy
C)accxxyy,bbxxyyD)accbbxxyy,bbxxyy
(36)有下列程序:
voidfun(intn,int*p)
{intf1,f2;
if(n==1||n==2)*p=1;
else
{fun(n-1,&f1);fun(n-2,&f2);
*p=f1+f2;
}
}
main()
{ints;
fun(3,&s);cout<
}
程序的运行结果是()。
A)2B)3C)4D)5
(37)下列程序的输出结果是________。
#include<>
char*fun(char*t)
{char*p=t;
return(p+strlen(t)/2);}
main()
{char*str="abcdefgh";
str=fun(str);
puts(str);}