c语言 指针讲义 复习资料文档格式.docx

上传人:b****5 文档编号:16255972 上传时间:2022-11-22 格式:DOCX 页数:33 大小:28.37KB
下载 相关 举报
c语言 指针讲义 复习资料文档格式.docx_第1页
第1页 / 共33页
c语言 指针讲义 复习资料文档格式.docx_第2页
第2页 / 共33页
c语言 指针讲义 复习资料文档格式.docx_第3页
第3页 / 共33页
c语言 指针讲义 复习资料文档格式.docx_第4页
第4页 / 共33页
c语言 指针讲义 复习资料文档格式.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

c语言 指针讲义 复习资料文档格式.docx

《c语言 指针讲义 复习资料文档格式.docx》由会员分享,可在线阅读,更多相关《c语言 指针讲义 复习资料文档格式.docx(33页珍藏版)》请在冰豆网上搜索。

c语言 指针讲义 复习资料文档格式.docx

(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[]="

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 可爱清新

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1