指针1.docx

上传人:b****9 文档编号:28635216 上传时间:2023-07-19 格式:DOCX 页数:12 大小:19.34KB
下载 相关 举报
指针1.docx_第1页
第1页 / 共12页
指针1.docx_第2页
第2页 / 共12页
指针1.docx_第3页
第3页 / 共12页
指针1.docx_第4页
第4页 / 共12页
指针1.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

指针1.docx

《指针1.docx》由会员分享,可在线阅读,更多相关《指针1.docx(12页珍藏版)》请在冰豆网上搜索。

指针1.docx

指针1

指针

一、指针概述

1.地址

C++程序中每一个实体,如变量、数组和函数等,都要在内存中占有一个可标识的存储区域。

每一个存储区域由若干个字节组成,在内存中,每一个字节都有一个“地址”,一个存储区的“地址”指的是该存储区中第一个字节的地址。

2.指针

指针就是存储区域的地址。

一个地址指向一个程序实体的存储空间。

直接访问:

通过变量名或地址访问程序中一个实体的存储空间的方式(其实通过变量名访问也就是通过地址访问)。

间接访问:

把一个变量的地址放在另一个变量中。

3.指针变量

专门用来存放地址的变量就叫指针变量,需要专门加以定义。

二、指针的类型与指针的定义

指针也是具有类型的。

指针的类型就是它所指向的变量的类型。

例如,一个指向int型的指针,一个指向一维数组的指针。

在使用一个指针变量之前,先要用声明语句对其进行定义。

例如:

int*p;

定义了一个指向整型数据的指针变量p。

即p是一个存放整型变量地址的变量。

应当特别注意的是,定义一个指针变量必须用符号“*”,它表示其后的变量为指针变量,指针变量为p,而不是*p。

要想使一个指针变量指向一个变量,必须将变量的地址赋给指针变量。

例如:

int*p,i=3;

p=&i;

指针变量也可以定义为指向实型、字符型以及其它类型的变量。

如:

float*p;

char*q;

三、指针运算符

在C++语言中,有两个有关指针的运算符:

&:

为取地址运算符,&x的值为x的地址。

*:

指针运算符,或称指向运算符,也称间接运算符,*p代表p所指向的变量。

如:

inta=15,*p;

p=&a;

cout<

cout<<*p<

*p=10;将10赋给p所指向的变量。

Cout<

注意:

此处的*p与定义指针变量时用的*p含义是不同的。

在定义时,“int*p”中的“*”不是运算符,它只是表示其后面的变量是一个指针类型的变量。

而在程序中的执行语句中引用的“*p”,其中的“*”是一个指针运算符,*p表示“p指向的变量”。

因此,inti,*p;

p=&i;

则:

*p和i相同。

例:

交换两个指针变量所指向的变量的值。

Voidmain()

{int*p1,*p2,i,i1=10,i2=20;

p1=&i1,p2=&i2;

i=*p1;*p1=*p2;*p2=i;

cout<

}

运行结果为:

2010

 

四、指针与数组

1.一维数组的指针表示方法

一维数组名代表数组的起始地址。

假设一个数组inta[5],其起始地址为1010,则:

a的值就为1010,a[0]的地址也为1010,

a[1]的地址为1014,也可以用a+1表示,也就是说,“a+1指向数组a中下标为1的元素”。

同样,a+i是a[i]的地址。

需要说明的是:

在编译系统计算实际地址时,a+i中的i要乘上数组元素所占的字节数,即:

a+i×(一个元素所占的字节数)。

例如:

a+1的实际地址为:

1010+1×4=1014;

a+3的实际地址为:

1010+3×4=1022;余类推。

或者说,a+i和&a[i]是相等的,都是a[i]的地址。

请注意区分a[i]与&a[i]二者的不同含义。

为了引用数组中的一个元素,可以用下面三种不同的方法:

(一)下标法:

如a[3]

(二)地址法:

通过地址a+3可以找到a[3]元素,*(a+3)就是a[3]。

因此下面二者等价:

a[i]——下标法

*(a+i)——地址法

都是指a数组中序号为i的元素值。

(三)定义一个指针变量,指向一数组元素。

例如:

定义一个指针变量p,使它的值等于某一元素的地址,这样*p就是该元素的值。

int*p,i=10;

p=&i;

例:

分别用下标法、地址法和指针法访问数组元素。

Voidmain()

{

inta[5]={1,3,5,7,9},*p,i;

for(i=0;i<5;i++)

cout<

cout<

for(i=0;i<5;i++)

cout<<*(a+i)<<””;/*用地址法*(a+i)输出*/

cout<

for(p=a;p

cout<<*p<<””;/*用指针变量*p输出*/

cout<

}

运行结果为:

13579

13579

13579

现在着重分析第三种方法:

用指针变量p指向数组元素的方法。

p的初值等于a,此时p指向a数组中第一个元素a[0],*p就是a[0]。

在输出*p的值后,p++使p指向下一个元素a[1],*p就是a[1],在输出*p的值后,p++又使p指向下一个元素,……,直到p=a+5为止。

由于p是变量,p的值不断在变化,而p的值是地址,因此p不断改变其指向。

五、指针与字符串

字符串存放在字符数组中。

因此,对字符串操作可以定义一个字符数组,也可以定义一个字符指针。

例:

用字符指针指向一个字符串。

Voidmain()

{

charstring[]=“CLanguage”;

char*p;

p=string;

cout<

cout<

}

运行结果:

CLanguageCLanguage

也可以不定义字符数组,而直接用一个指针变量指向一个字符串常量。

如:

voidmain()

{

char*p=”CLanguage”;

cout<

}

程序中虽然没有定义数组,但字符串在内存中是以数组形式存放的。

它有一个起始地址,占一片连续的存储单元,并以“\0”结束。

char*p=”CLanguage”;的作用是:

使指针变量P指向字符串的起始地址。

六、指针数组

一个数组,如果每个元素的类型都是整型的,那么这个数组称为整型数组;如果每个元素都是同类型的指针类型,则它是指针数组。

也就是说,指针数组是用来存放一批地址的。

前已述及,在初始化字符数组时,可以用指针变量来代替字符数组。

例如:

char*string=“Iamastudent”;

如果有五个字符串,可以用五个指针变量来指向它,这就是指针数组。

例如:

char*name[5]={“LiFang”,“ZhangLi”,“LingMaoTi”,“SunFei”,“Wangfang”}

name是一维数组,它有五个元素,每个元素都是指向字符数据的指针型数据。

其中,name[0]指向第一个字符串“LiFang”。

七、指针与函数

指针与函数的关系,主要表现在如下三个方面:

1.用指针作为函数参数

2.函数的返回值是指针

3.指向函数的指针

1.指针作为函数参数

例:

有一数组,有10个元素,要求输出其中最大和最小的元素。

#defineN10

voidmain()

{

voidmax_min(intarr[],int*pt1,int*pt2,intn);

intarray[N]={1,8,10,2,-5,0,7,15,4,-5};

int*p1,*p2,a,b;

p1=&a;p2=&b;

max_min(array,p1,p2,N);

printf(“max=%d,min=%d\n”,a,b);

}

voidmax_min(intarr[],int*pt1,int*pt2,intn)

{

inti;

*pt1=*pt2=arr[0];

for(i=0;i

{

if(arr[i]>*pt1)*pt1=arr[i];

if(arr[i]<*pt2)*pt2=arr[i];

}

}

2.指向函数的指针

一个函数包括一系列的指令,在内存中占据一片存储单元,它有一个起始地址,即函数的入口地址,通过这个地址,可以找到该函数,这个地址就称为函数的指针。

我们可以定义一个指针变量,使它的值等于函数的入口地址,那么通过这个指针变量,也能调用该函数,这个指针变量称为指向函数的指针变量。

定义一个指向函数的指针变量的一般形式:

类型标识符(*指针变量名)();

例如int(*p)();

它表示p指向一个返回值为整型的函数。

注意,*p两边的括弧不能省略。

如果写成int*p();就称了返回指针值的函数。

在定义了指向函数的指针变量后,可以将一个函数的入口地址赋给它,这就实现了使指针变量指向一个指定的函数。

如:

p=fun1;

可以用下列形式调用函数:

(*指针变量)(实参列表);

例如:

(*p)(a,b);其相当于fun1(a,b);也可以写成p(a,b);

例6.26写一个程序,给出一个一维数组的元素值,先后四次调用一个函数,分别求①数组中元素之和②最大值③下标为奇数的元素之和④求各元素的平均值。

#defineN12

main()

{

staticfloata[12]={1.5,3.8,5.6,7.8,91.6,1.61,13.3,

15.0,17.5,19.9,21.7,23.0};

floatarr_add(),odd_add(),arr_ave(),arr_max();

voidprocess(float*p,intn,float(*fun)());

intn=N;

printf("thesumof%delementsis:

",n);

process(a,n,arr_add);

printf("thesumofoddelementsis:

");

process(a,n,odd_add);

printf("theaverageof%delementsis:

",n);

process(a,n,arr_ave);

printf("themaximumof%delementsis:

",n);

process(a,n,arr_max);

}

voidprocess(float*p,intn,float(*fun)())

{

floatresult;

result=(*fun)(p,n);

printf("%8.2f\n",result);

}

floatarr_add(floatarr[],intn)

{

inti;

floatsum=0;

for(i=0;i

sum=sum+arr[i];

return(sum);

}

floatodd_add(float*p,intn)

{

inti;

floatsum=0;

for(i=0;i

sum=sum+*p;

return(sum);

}

floatarr_ave(float*p,intn)

{

inti;

floatsum=0,ave;

for(i=0;i

sum=sum+p[i];

ave=sum/n;

return(ave);

}

floatarr_max(floatarr[],intn)

{

inti;

floatmax;

max=arr[0];

for(i=1;i

if(arr[i]>max)max=arr[i];

return(max);

}

4.返回指针的函数

一个函数在调用之后可以带回一个值返回到主调函数,这个值可以是整型、实型、字符型等,也可以是一个指针类型。

定义这种函数的例子如:

int*fun(a,b);

例:

编写一个函数,它的作用是在一个字符串中找一个指定的字符,并返回该字符的地址

char*strchr(char*str,charch)

{

while(*str++!

='\0')

if(*str==ch)

returnstr;

return(0);

}

main()

{

char*strchr(char*str,charch);

char*pt,ch,line[]="IloveChina";

ch='C';

pt=strchr(line,ch);

printf("\nstringstartsataddress%o.\n",line);

printf("Firstoccurrenceofchar%cisaddress

%o.\n",ch,pt);

printf("Thisisposition%d(startingfrom0)\n",pt-line);

}

八、指针的运算

指针是一种数据类型,应具有无符号整数的值。

由于地址本身的特征,也给指针运算带来一些限制,它只能进行:

●与整数相加、减运算

●同一数组中各元素地址间的关系运算与相减运算

●赋值运算

其它的运算,如两个指针相加、相乘、相除、移位以及指针与实数相加等都是不允许的。

(一)指针与整数相加、减

指针与整数相加、减,表示指针在内存空间上、下移动,移动以其类型的长度为单位。

(二)指向同一数组中元素的指针的关系运算与相减运算

指向同一数组中元素的指针的关系运算,是比较它们之间的地址大小。

两个指针相等,表明它们指向同一数组元素。

两个指向同一数组中的元素的指针相减,是计算它们之间的元素数目。

(三)指针赋值

指针可以通过赋值运算改变其所指向的实体,有三种情形:

(1)给指针赋以一个对应类型的变量地址,如

floatf1,f2;

float*p=&f1;

(2)同一类型指针间的赋值,如

inta,b;

int*pa=&a,*pb=&b;

pa=pb;

(3)指针增1、减1,即指针向上或向下移动一个所指向的数据类型空间。

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

当前位置:首页 > 表格模板 > 书信模板

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

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