第06章指 针 和 引 用.ppt_第1页
第06章指 针 和 引 用.ppt_第2页
第06章指 针 和 引 用.ppt_第3页
第06章指 针 和 引 用.ppt_第4页
第06章指 针 和 引 用.ppt_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 指 针 和 引 用,6.1 指 针 6.2 引 用,6.1 指 针,6.1.1 指针的概念 所谓指针是一个存储单元的地址值,用来存放地址(即指针)的变量也称指针变量。在上下文意义明确的情况下,常常将指针变量也简称为指针。,指针变量和普通变量一样占有一定的存储空间,但它与普通变量的区别在于指针变量的存储空间中存放的不是普通的数据,而是一个地址值指针。,6.1.1.1 指针的声明 指针是一个变量,必须先声明后使用。指针声明的一般形式如下: 数据类型 * 标识符; 注意:指针声明语句中的数据类型是指针变量所指向的变量的数据类型,即指针变量所指向的存储单元中存储数据的数据类型,并不是指针变量本

2、身的类型,任一指针变量本身数据值的类型都是unsigned long int。,6.1.1.2 指针变量运算符 1. 取地址运算符,【例6.1】变量地址及取地址运算符的使用。 #include void main() int i=1; couti=it变量i的地址为: ,运行程序,输出显示结果: i=1 变量i的地址为:0 x0012FF7C,2. 间接访问运算符* 该运算符也称“指针运算符”或“取内容运算符”,它后面必须是一个指针变量,表示访问该指针变量所指向的变量,即访问指针所指向的存储单元的内容。 例如: int i=1,*p=,注意: (1)不要将间接访问运算符“*”与声明指针时的“*

3、”混为一谈。指针声明时的“*”是指针变量声明的标示,可以称为“指针指示符”,而间接访问运算符“*”用来访问指针所指向的变量。 (2)通过以上的说明可以看出,*运算和 p=,couta=aendl; coutp=pendl; cout ,运行程序,输出显示结果: a=15 p=0 x0012FF7C int *p1= /声明二级指针p2,i=1; couti=iendl; cout*p1=*p1endl; coutp1=p1endl; cout*p2=*p2endl; coutp2=p2endl; cout*p2=*p2endl; ,运行程序,输出结果为: i=1 *p1=1 p1=0 x001

4、2FF7C *p2=0 x0012FF7C p2=0 x0012FF78 *p2=1,6.1.2 指针与数组 数组在内存中的起始地址称为数组的指针,数组元素在内存中的起始地址称为数组元素的指针。 用来保存数组指针的变量称为数组的指针变量,简称为数组的指针。用来保存数组元素指针的变量称为数组元素的指针变量,简称为数组元素的指针。,6.1.2.1 用指针访问数组元素 【例6.5】通过数组名访问数组元素。 #include void main() int x5=1,2,3,4,5;,for(int i=0;i5;i+) coutxit; coutendl; for(i=0;i5;i+) cout*(

5、x+i)t; coutendl; ,运行程序,将输出结果: 12345 12345,(1)下标法 数组名下标法:xi。 指针变量下标法:pi。 (2)指针法 数组名指针法:x+i表示数组元素xi的地址,*(x+i)表示数组元素xi。 指针变量指针法:p+i表示数组元素xi的地址,*(p+i)表示数组元素xi。,在使用指向一维数组的指针变量时,要注意以下几点: (1)p+i并不是简单地使指针变量的值加上i,而是p+i*n,其中n是数组元素所占用的字节数。 (2)利用指针对数组进行操作时,还必须注意越界问题。,(3)可以通过改变指针变量本身值的方法(如p+)来指向不同的数组元素,但是数组名表示数组

6、的起始地址,是一个地址常量,是不能改变的,如写成x+就是错误的。 (4)要注意指针变量的当前值。,【例6.7】分析下面的程序。 #include void main() int x5, *p=x ; for(int i=0;i*p+; ,for(i=0;i5;i+) cout*p+t; coutendl; ,运行程序后,用户输入1,2,3,4,5后回车,屏幕上输出显示如下: 1245120 4213209 1 4460192 4460000,6.1.2.2 指针数组 由指针组成的数组称为指针数组,即指针数组的每一个元素都是指针。 声明指针数组的一般格式如下: 数据类型 *数组名常量表达式1常量

7、表达式2;,【例6.8】指针数组的使用。 #include void main() int x23=1,2,3,4,5,6; int i,j; int *p2=x0,x1; /声明指针数组并初始化,for(i=0;i2;i+) for(j=0;j3;j+) cout*(pi+j)t; /利用指针数组输出其指向的元素的值 coutendl; ,运行程序,将输出结果: 123 456,6.1.2.3 数组指针 数组指针就是一个指向数组的指针,其声明格式如下: 数据类型 (*指针名)常量表达式1常量表达式2;,【例6.9】利用数组指针改写例6.8。 #include void main() int

8、x23=1,2,3,4,5,6; int i,j; int (*p)3=x;,for(i=0;i2;i+) for(j=0;j3;j+) coutpijt; coutendl; ,6.1.3 指针与字符串 在C+语言中,字符串被表示成一个字符数组。因此,有时也把字符串称为字符数组。由于字符串中的每一个字符对应字符数组中的一个数组元素,故用户可以利用指针指向字符数组中的任何一个数组元素,即指向字符串中的任何一个字符。例如: char *s1=Hello World!;,在C+语言中,字符串既可以用字符数组表示,也可以用字符指针变量来表示。 例如,定义一个20个字符的字符数组a的语句为:char

9、a20。 用户可以在定义字符数组的同时进行初始化。例如:char a = How are you!。,C+规定:字符数组的最后一个元素必须是0字符。 在引用字符串时,既可以逐个字符引用,也可以作为一个整体引用。,【例6.10】分析下面程序的运行结果。 #include #include void main() char a=01234,b=56789; char *sa=a,*sb=b;,for(int i=0;i5;i+) *sa+=*sb+; coutaendl; coutbendl; 运行程序,输出结果为: 56789 56789,6.1.4 指针与函数 6.1.4.1 指针作为函数的参

10、数,【例6.11】利用指针作为函数参数交换实参变量的值。 #include void swap(int *a,int *b); void main() int x=1,y=2; cout交换前endl;,coutx=x,y=yendl; swap( ,void swap(int *a,int *b) int temp; temp=*a; *a=*b; *b=temp; ,运行程序,输出结果: 交换前 x=1,y=2 交换后 x=2,y=1,6.1.4.2 数组作为函数的参数 【例6.12】将一个数组中的元素前后逆置。 #include void transpose(int x,int n);

11、void main() int a6=1,2,3,4,5,6; int i;,cout原数组:; for(i=0;i6;i+) couttai; coutendl; transpose(a,6); cout逆置后:;,for(i=0;i6;i+) couttai; coutendl; void transpose(int x,int n) int temp,i;,for(i=0;in;i+,n-) temp=xi; xi=xn-1; xn-1=temp; ,运行程序,将输出结果: 原数组:123456 逆置后:654321,【例6.13】用选择排序法把n个整数按从大到小的顺序排列。 选择排序法

12、的思想:第1轮从n个元素中选择最大的一个元素,把它和位于第1个位置的元素互换;第2轮在剩下的n-1个元素中选择次大的一个元素,把它和位于第2个位置的元素互换;第n-1轮在剩下的2个元素中选择较大的一个元素,把它和位于第n-1个位置的元素互换,最后剩下的一个元素必然是最小的,排序完成。,#include #define n 8 void sort(int x,int m); void main() int an,i; coutai; /从键盘输入要排序的数据,sort(a,n); /用选择排序法实现降序排列 cout排序结果为endl; for(i=0;in;i+) coutai ; /输出排序

13、结果 coutendl; ,void sort(int x,int m) int i,j,k,t; for(i=0;im-1;i+) /外循环,控制循环次数 k=i; /预置本轮次最大元素的下标值,for(j=i+1;jxk) k=j; /存在更大元素,保存其下标 if(k!=i) t=xi; /交换位置,xi=xk; xk=t; ,运行程序,输出结果为: 请输入要排序的8个整数 23 35 56 45 26 4 9 17 排序结果为 56 45 35 26 23 17 9 4,6.1.5 动态内存分配 6.1.5.1 运算符new 运算符new用于申请所需的内存单元。它的使用格式如下: *

14、= new ;,例如: int *pi; /整数类型指针 float *pf; /浮点类型指针 pi= new int; /为一个整数类型的数分配内存 pf = new float; /为一个浮点类型的数分配内存,说明:如果分配成功,则返回一个指向该分配空间的指针,如果此空间不可用或者分配空间失败或者检测到某些错误,则返回零或空指针。因此,在实际编程时,对于动态内存分配,应在分配操作结束后,首先检查返回的地址值是否为零,以确认内存申请是否成功。,在堆中也可以用运算符new申请一块保存数组的内存单元,即创建一个数组。创建一数组的格式如下: 指针 = new 数据类型下标表达式 需要注意的事,由运

15、算符new动态分配的存储空间的生存周期是任意的,只有在程序中使用运算符delete释放它们时,其生存周期才结束。,6.1.5.2 运算符delete 当程序中不再需要使用运算符new申请到的某个内存时单元时,就必须用运算符delete来释放它。这一操作的表述形式如下: delete 指针名; /释放非数组内存单元 delete 指针名; /释放数组内存单元,当程序从声明指针的函数返回前必须利用该指针删除在函数中申请的内存单元。否则,指针将退出作用域,不能再用,那么这个内存单元在整个程序运行结束前,就无法释放,从而不能再用,这就是所谓的内存遗漏问题。,6.2 引 用,6.2.1 引用的概念 在C+语言中,提供了一种为变量起一个别名的机制,这个别名就是引用。,引用声明的一般格式如下: 数据类型 ,【例6.15】引用的声明和使用。 #include void main() int a=1; int /对b赋值就等价于对a赋值,couta=aendl; coutb=bendl; cout ,运行程序,将输出结果: a=1 b=1 a=2 b=2 cout

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论