C语言指针练习题解析Word下载.docx
《C语言指针练习题解析Word下载.docx》由会员分享,可在线阅读,更多相关《C语言指针练习题解析Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
![C语言指针练习题解析Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/18/8128c984-3065-4ec9-8080-6844ad2045e9/8128c984-3065-4ec9-8080-6844ad2045e91.gif)
inta,b,*p;
floatc,*q;
A.p=&
cB.q=pC.p=NULLD.q=newint
C
指针变量使用规定,不同类型的指针变量不能赋值,也不能取得普通变量地址,故A、B不正确,不能选择。
因为q是float类型指针变量,不能申请int类型地址,D不正确,也不能选择。
因为任何类型的指针变量都能取得NULL指针,所以C正确。
例题3:
如果x是整型变量,则合法的形式是()。
A.&(x+5)B.*x C.&
*x D.*&
x
因为C++语言表达式没有地址,A不正确。
C++语言普通变量不能用*运算,因此B和C也不正确。
&
x表示变量x的地址,*&
x是x地址的值,所以D正确。
例题4:
若要建立如下关系,错误的语句组是()。
spanstyle='
mso-ignore:
vglayout;
;
z-index:
1;
left:
0px;
margin-left:
144px;
margin-top:
1px;
width:
256px;
height:
38px'
A.B.C.D.
int*p=&
x,x;
intx,p=&
x;
int*p,x=10;
int*p,x;
*p=10;
*p=&
p=&
x;
x=10;
A
在变量类型说明语句中*表示变量是指针变量,在其他语句中,*称为指针运算,用于访问指针所指向的对象的值,&
称为取地址运算,用来得到一个对象的地址。
故B、C、D都是正确的,不能选择。
A中指针变量p取不到x地址,因为x还没有定义,所以选择A。
例题5:
若有语句inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
则()不是对a数组元素的正确引用(其中0≤i<
10)。
A.p[i] B.*(*(a+i))C.a[p-a]D.*(&
a[i])
B
指针就变量p取得数组a的首地址,由指针与数组关系知,p[i]表示数组元素第i+1元素值,p[i]=a[i]正确,故A不能选。
*(a+i)表示一维数组a第i+1元素值,*(*(a+i)表示对第i+1元素值再取值是错误操作,所以选B。
a[p-a]=a[0]正确,故不能选择C。
*(&
a[i])也正确(见上题),也不能选D。
例题6:
写出下列程序运行结果是()。
#include
voidmain()
{
charch[3][4]={“AAA”,”BB”,”CCC”},(*q)[4]=ch,*p;
//ch是二维数组,q是指向一维数组指针,并且一维数组每行只有4个字符
//q并取得二维数组ch首地址
inti;
p=newchar;
//申请地址
*p=’b’;
//装入字符b
*(*q+3)=*p;
for(i=0;
i<
3;
i++)cout<
<
Q[I]<
ENDL;
SPAN>
}
A.B.C.D.
AAAbBBAAAbAAAAAA
BBBBbBBBB
CCCCCCCCCCCC
二维字符数组初始化后值如下表:
1
2
3
\0
执行语句*(*q+3)=*p后二维字符数组值:
b
在输出语句中q[0]输出是AAAbBB,q[1]输出是BB,q[2]输出CCC,只能选择A。
例题7:
写出下列程序运行结果:
#include
voidmain()
{int*pn,n=10,m=20;
float*pf,px=3.14159,py=2.71828;
pn=&
n;
*pn+=m;
cout<
”n现在的值是:
”<
*pn<
pf=&
px;
py+=5*(*pf);
”py现在的值是:
”<
PY<
运行结果是:
n现在的值是:
30
pf现在的值是:
18.4262
指针是通过在变量前加一个“*”来定义,使用用“*”加变量名存取指针所指的值,用运算“&
”取变量的地址,但是不能存取无指向的指针所指向内容,这样会导致系统故障。
例题8:
{intI,*p,a[]={10,20,30,40,50,60};
p=a;
for(I=0;
I<
5;
I++)
”a[“<
A[I]<
’\T’<
”*(A+”<
*(A+I)<
’\t’<
”*(p+”<
*(P+I)<
”P[“<
P[I]<
运行结果:
a[0]=10*(a+0)=10*(p+0)=10p[0]=10
a[1]=20*(a+1)=20*(p+1)=20p[1]=20
a[2]=30*(a+2)=30*(p+2)=30p[2]=30
a[3]=40*(a+3)=40*(p+3)=40p[3]=40
a[4]=50*(a+4)=50*(p+4)=50p[4]=50
a[5]=60*(a+5)=60*(p+5)=60p[5]=60
分析程序根据指针与数组关系,引用数据可以有四种不同的表示方法:
使用数组下标变量;
使用数据固有的指针——数组名间接引用;
使用指向数组的指针的间接引用;
使用指向数组的指针下标引用。
例题9:
指出下列程序运行结果:
intb[4][4]={{10,11,12,13},{14,15,16,17},{18,19,20,21},{22,23,24,25}};
{int(*a)[4],*p;
a=b;
//指针变量a,取得二维数组第一行地址
p=a[1];
//指针变量p,取得二维数组第二行第一列地址
for(intI=1;
=4;
p=p+1,I++)//A行
*p<
'
\t'
;
cout<
for(I=0;
=3;
I++)//B行
{cout<
*(*a+1)<
a++;
}//C行
14151617
11151923
根据题意,指针变量p取得二维数组第二行第一列地址,进行循环语句后,每循环一次,指针变量下移一个元素,A行循环输出是14,15,16,17。
指向一维数组指针a,取得二维数组第一行地址,由指向一维数组指针定义,*a+1表示该行第一列元素地址,*(*a+1)表示该地址的值,所以B行输出是11,15,19,23。
例题10:
voidfun(int*&
a,int&
m)
{a=newint[m];
//A
int*p=a;
for(inti=0;
M;
I++)<
*p++=i*i+1;
}
voidmain()
{int*b,n=5;
fun(b,n);
N;
cout<
B[I]<
SPAN?
>
delete[]b;
//B
1251017
指针变量在函数main中没有取得地址,所以在A行中,对被调用函数fun给对应的形参指针变量申请地址,即指针变量b和形参指针变量p指向同一组地址。
B行对申请地址释放。
例题11:
下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。
voidchange()//1
{inti=0;
for(i=0;
;
i++)//2
if(a[i]>
='
a'
a[i]<
z'
)
;
//3
{charp[80];
"
\n"
cin.getline(p,80);
//读一行字符,中间可以有空格
change(p);
P<
如程序运行时得到以下结果:
请输入一行字符:
Thisisabook..
THISISABOOK.
(1)char*a或chara[80]
(2)a[i]或a[i]!
=’\0’
(3)a[i]=a[i]–32或a[i]-=a[i]
(1)
由指针和字符串关系知:
当实参是数组,形参可以是字符串变量,也可以是字符指针变量。
(2)
循环语句结束条件是字符标记’\0’。
(3)
大写字母的ASCII码比小室字母的ASCII码小32。
例题12:
下列函数swap实现数据交换功能功能,请填空。
voids*p,int*q)
{inttemp;
temp=*p;
//1
//2
{inta,b;
int*p1,*p2;
请输入两个正数:
cin>
a>
b;
p1=&
a;
p2=&
s);
结果a和b的值:
A<
"
B<
1020
20,10
(1)
*p=*q
(2)
*q=temp;
实参和形参都是指针变量,所以指针变量p1和p指向同一个地址,同样p2和q也指向同一个地址。
函数swap()是交换两个数,故应填写语句*p=*q、*q=temp。
例题13:
下列函数sort实现对字符串按字典顺序由小到大排序,请填空。
voidsort()//1
{char;
inti,j;
N-1;
for(j=0;
j<
N-1-I;
J++)<
if(strc