c语言 指针讲义 复习资料文档格式.docx
《c语言 指针讲义 复习资料文档格式.docx》由会员分享,可在线阅读,更多相关《c语言 指针讲义 复习资料文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
(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、已知:
doubled;
希望指针变量pd指向d,下面对指针变量pd的正确定义是()。
A)doublepd;
B)double&
pdC)double*pdD)double*(pd)
3、若x为整型变量,p是指向整型数据的指针变量,则正确的赋值表达式是()。
A)p=&
xB)p=xC)*p=&
xD)*p=*x
二、填空题
1、要使指针变量与变量之间建立联系,可以用运算符来定义一个指针变量,用运算符来建立指针变量与变量之间的联系。
inta=10,*p=&
则“printf("
%d,%d\n"
a,*p);
”的输出结果是。
3、已知:
floatf1=3.2,f2,*pf1=&
f1;
现在希望变量f2的值为3.2,可使用赋值语句或。
4、已知:
intb=5,*p=&
b;
并且b的地址为4000,则“printf("
%d,%d"
p,*p);
三、阅读程序,回答问题。
1、main()
{intvar,*p;
var=100;
*p=&
var;
var=*p+10;
printf("
%d"
var);
}
运行结果:
2、#include<
stdio.h>
voidprtv(int*x)
{printf("
%d\n"
++*x);
main()
{inta=25;
prtv(&
a);
能力提高(B)
inta,*p=&
则下列函数调用中错误的是()。
A)scanf("
&
B)scanf("
p);
C)printf("
a);
D)printf("
inti=0,j=1,*p=&
i,*q=&
j;
错误的语句是()。
A)i=*&
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(intx,inty)
{intt;
t=x;
x=y;
y=t;
C)func(int*x,int*y)
{*x=*y;
*y=*x;
D)fund(int*x,int*y)
t=*x;
*y=t;
二、阅读程序,写出运行结果
1、#include<
{inta,b;
a=5;
b=10;
beforeswapa=%d,b=%d\n"
a,b);
swap(a,b);
afterswapa=%d,b=%d\n"
swap(intx,inty)
{inttemp;
temp=x;
y=temp;
inswapx=%d,y=%d\n"
x,y);
swap(&
a,&
b);
swap(int*px,int*py)
temp=*px;
*px=*py;
*py=temp;
*px,*py);
比较上面两个程序,试说明两者的区别?
第2讲
1、指针变量做实参:
(1)指针变量做实参,实质传的是指针所指向的变量的地址-----即传地址调用;
(2)指针变量做实参,形参必须是指针,即通过形参指针操纵主调函数中的变量;
2、指向数组的指针变量:
(1)定义一个指向数组元素的指针变量的方法,与定义指向变量的指针变量相同;
(2)使指针指向数组首地址:
将数组名赋值给已定义的指针变量;
使指针指向数组的某一元素:
将数组元素地址赋值给已定义的指针变量;
intarr[10];
int*p;
//定义指针变量,类型与将要指向的数组类型一致;
p=arr;
//p指针指向arr数组的首地址;
等价于p=&
arr[0];
p=&
a[9];
//p指针指向arr数组的最后一个元素arr[9];
3、通过指针引用数组元素:
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、在使用指向数组的指针变量时,应注意的问题:
intarr[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)
inta[10],*p=a;
则下面说法不正确的是()。
A)p指向数组元素a[0]B)数组名a表示数组中第一个元素的地址
C)inta[10],*p=&
a[0];
与上述语句等价D)以上均不对
inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则不能表示数组a中元素的表达式是()。
A)*pB)a[10]C)*aD)a[p-a]
1、在C语言中,指针变量的值增1,表示指针变量指向下一个,指针变量中具体增加的字节数由系统自动根据指针变量的决定。
inta[5],*p=a;
则p指向数组元素a[0],那么p+1指向。
若“printf("
”的输出结果是200,那么:
“printf("
p+1);
3、对数组元素的引用方法有两种:
和。
设inta[10],*p=a;
则对a[3]的引用可以是或。
4、在C程序中,可以通过三种运算来移动指针:
、、。
5、设有如下定义:
inta[5]={0,1,2,3,4},*p1=&
a[1],*p2=&
a[4];
则p2-p1的值为______,*p2-*p1的值为。
三、阅读程序,写出运行结果
{inta[10],i,*p;
*p=a;
for(i=0;
i<
10;
i++)
scanf("
a[i]);
for(;
p<
a+10;
p++)
*p);
执行程序,输入:
0123456789
2、main()
{inta[10],*p;
p=&
p=a;
for(p=a+9;
p>
=a;
p--)
1、已知:
inta[]={1,2,3,4},y,*p=&
a[1];
则执行语句"
y=*p++;
"
之后,变量y的值为()。
A)3B)2C)1D)4
2、已知:
y=++(*p);
之后,下面()元素的值发生了变化。
A)a[0]B)a[1]C)a[2]D)都没发生变化
3、已知:
intx[]={1,3,5,7,9,11},*ptr=x;
则能够正确引用数组元素的语句是()。
A)xB)*(ptr--)C)x[6]D)*(--ptr)
4、若有以下语句并且0<
=k<
6,则正确表示数组元素地址的语句是()。
intx[]={1,3,5,7,9,11},*ptr=x,k;
A)x++B)&
ptrC)&
ptr[k]D)&
(x+1)
5、已知:
inta[]={1,2,3,4,5,6},*p=a;
则值为3的表达式是()。
.
A)p+=2,*(p++)B)p+=2,*++pC)p+=3,*p++D)p+=2,++*p
6、若第一个printf语句的输出为194,则第二个printf语句的输出为()。
%x"
p+9);
A)203B)212C)1a6D)19d
二、阅读程序,写出运行结果
{inta[]={1,2,3,4,5};
intx,y,*p;
x=*(p+2);
y=*(p+4);
*p=%d,x=%d,y=%d\n"
*p,x,y);
运行结果:
{inta[]={1,2,3,4,5,6};
int*p;
%d,"
*(++p));
*++p);
*(p--));
p+=3;
*p,*(a+3));
三、程序填空
1、下面的程序实现从10个数中找出最大值和最小值.
intmax,min;
find_max_min(int*p,intn)
{int*q;
max=min=*p;
for(q=;
;
q++)
if()max=*q;
elseif()min=*q;
{inti,num[10];
input10numbers:
\n"
);
scanf(%d"
num[i]);
find_max_min(num,10);
max=%d,min=%d\n"
max,min);
四、编程
1、编写两个函数,分别完成一维数组的输入和输出.
{inta[10];
input(a,10);
output(a,10);
voidinput(int*p,intn)
{
voidoutput(int*p,intn)
第3讲
1、数组、指针和函数的结合应用:
传值调用
传地址调用
实参类型
变量名
变量地址
数组名
数组名或数组元素地址
要求形参的类型
指针
数组
传递的信息
变量的值
变量的地址
数组的起始地址
数组的起始地址或数组元素地址
通过函数调用能否改变实参的值
不能
能
2、二维数组的地址问题:
inta[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(*p)[4]=a;
(1)
(1)int(*p)[4]=a;
表示p是一个指向二维数组(一行有四个元素的)行地址的行指针;
(2)p+1;
行指针加1,是加一行元素的字节数的和;
p=p+1;
行指针从当前行指向下一行;
inta[3][4],*p=a;
则p表示()。
A)数组a的0行0列元素B)数组a的0行0的地址
C)数组a的0行首地址D)以上均不对
inta[3][4],*p;
若要指针变量p指向a[0][0],正确的表示方法是()。
A)p=aB)p=*aC)p=**aD)p=a[0][0]
doubleb[2][3],*p=b,下面哪个不能表示数组b的0行0列元素()。
A)b[0][0]B)**pC)*p[0]D)*p
4、设有说明int(*ptr)[M];
其中的标识符ptr是()。
A)M个指向整型变量的指针
B)指向M个整型变量的函数指针
C)一个指向M个整型元素的一维数组的指针
D)具有M个指针元素的一维指针数组,每个元素都只能指向整型变量
下面程序段中第一个printf语句的输出是200,则第二个printf语句的输出是,第三个printf语句输出是。
'
inta[2][3]={1,2,3,4,5,6},*p=&
a[0][0];
则表示元素a[0][0]的方法有指针法:
数组名法:
。
*(p+1)的值为。
三、阅读程序,写出运行结果
{inta[2][3]={0,1,2,3,4,5},*p1,*p2;
p1=a;
p2=&
p1,p2);
*p1,*p2);
p1+1,p2+1);
*(p1+1),*(p2+1));
假设数组a的首地址为3000,则运行结果为:
inti,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}
staticinta[2][3]={2,4,6,8,10,12};
正确表示数组元素地址的是()。
A)*(a+1)B)*(a[1]+2)C)a[1]+3D)a[0][0]
{inta[2][3]={{1,2,3},{4,5,6}};
intm,*ptr;
ptr=&
m=(*ptr)*(*(ptr+2))*(*(ptr+4));
m);
{inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,13};
int(*ptr)[4];
intsum=0,i,j;
ptr=a;
i<
3;
i++)
for(j=0;
j<
2;
j++)
sum+=*(*(ptr+i)+j);
sum);
1、下面程序通过指向整型的指针将数组a[3][4]的内容按3行*4列的格式输出,请给printf()填入适当的参数,使之通过指针p将数组元素按要求输出.
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p=a;
{inti,j;
i++)
j<
4;
j++)
%4d"
);
第4讲
1、指向字符串的指针变量:
(1)定义指向字符串的指针:
char*指针名=字符串;
如char*ps=“Iamateacher.”;
//这里是将字符串的首地址存放在字符指针中,而不是将字符串中的字符存入指针;
(2)比较:
char*ps=“Iamateacher.”;
√
分开:
char*ps;
ps=“Iamateacher.”;
//因为可以将字符串的首地址存放在指针中;
chars[20]=“Iamateacher.”;
分开:
chars[20];
s=“Iamateacher.”;
×
//因为s表示字符数组的首地址,是常量,不能在赋值号的左端,不能将字符串的首地址赋值给数组名;
(3)再比较:
chars[20];
scanf(“%s”,s);
变换:
char*ps;
scanf(“%s”,ps);
//错在字符指针没有指向任何存储空间,不能给他输入字符串;
改成:
chars[20],*ps;
ps=s;
√
//字符指针在没有指向一个确切的字符数组时,不能使用%s格式符,输入字符串;
2、字符串指针作函数参数:
实参
形参
字符指针变量
charstr[]="
OK!
;
对指针变量ps的说明和初始化是()。
A)charps=str;
B)char*ps=str;
C)charps=&
str;
D)char*ps=&
2、下面不正确的字符串赋值或赋初值的方式是()。
A)char*str;
str="
string"
B)charstr[7]={'
s'
'
t'
r'
i'
n'
g'
};
C)charstr[10];
D)charstr1[]="
str2[20];
strcpy(str2,str1);
charb[5],*p=b;
则正确的赋值语句是()。
A)b="
abcd"
B)*b="
C)p="
D)*p="
4、已知:
chars[20]="
programming"
*ps=s;
则不能引用字母o的表达式是()。
A)ps+2B)s[2]C)ps[2]D)ps+=2,*ps
5、下列对字符串的定义中,错误的是()。
A)charstr[7]="
FORTRAN"
B)charstr[]="