C语言程序设计8n.ppt_第1页
C语言程序设计8n.ppt_第2页
C语言程序设计8n.ppt_第3页
C语言程序设计8n.ppt_第4页
C语言程序设计8n.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计,主讲教师:贾明兴 牛大鹏,东北大学信息科学与工程学院自动化所,2,第8章 指针,8.1 指针的概念 8.2 指针变量的定义和引用 8.3 指针与一维数组 8.4 指针与字符串 8.5 指针与多维数组 8.6 指针数组与指向指针的指针 8.7 返回指针值的函数 8.8 指向函数的指针 8.9 动态内存分配,东北大学信息科学与工程学院自动化所,3,8.1 指针的概念,指针地位:,指针是C语言的一个重要概念,也是C语言的一个重要特色。深刻理解和正确使用指针是学习本章的基本要求。,指针优点:,直接访问内存 实现函数间的数据传递,东北大学信息科学与工程学院自动化所,4,一、地址,在计算机

2、中,把内存区划分为一个一个的存储单元,每个单元为一个字节(位),它们都有一个编号,这个编号就是内存地址。如下图所示:,注意:1、程序中定义的每个数据在编译后都占有各自的内存区。 2、数据所占有的存储单元个数是由其类型决定的。 3、首地址:第1个单元的地址 4、表示地址的数与整数的区别,8.1 指针的概念,东北大学信息科学与工程学院自动化所,5,二、举例,如有定义:char c=A; int a=3; 则所占内存情况如下:,注意:c和a的地址可能相邻,也可能不相邻,是由系统分配的,我们不用关心。,8.1 指针的概念,东北大学信息科学与工程学院自动化所,6,三、指针与指针变量,1、指针:简单地说,

3、指针就是地址。二者是同一个概念的两种说法。只不过指针更形象一些,就像一个针一样,可以指向某个地方。,2、指针变量:首先指针变量就是一个变量,和我们以前所讲的其它变量没有本质区别。不同之处在于这种变量中所存放的内容是地址。,什么是指针变量呢?我们回忆一下什么叫整型变量,8.1 指针的概念,东北大学信息科学与工程学院自动化所,7,四、直接访问和间接访问,有两个上锁且放着物品的盒子A、B, 如果你有A盒子的钥匙,则可以直接打开A盒子将物品取出; 如果你有B盒子的钥匙,而A盒子的钥匙在B盒子中,要想取出A盒子中的物品,则必须先打开B盒子,取出A盒子的钥匙,再打开A盒子将物品取出。 上面两种情况就是直接

4、访问和间接访问的概念。,8.1 指针的概念,东北大学信息科学与工程学院自动化所,8,1、直接访问,通过变量本身对变量进行存取的方式,称为直接访问。 如定义:int x; 则x=10; x+=5; 等等 这种访问方式只需要变量本身就得到了该变量的全部信息,不需要其它内容,是直接的。,8.1 指针的概念,东北大学信息科学与工程学院自动化所,9,2、间接访问,通过指针变量实现对变量的访问方式,称为间接访问。 首先要定义一个指针变量,然后将一个同类型变量的地址赋给该指针变量(这时我们称指针变量指向该变量),这样就可以进行间接访问了。 间接访问的过程是:由指针变量得到变量的地址,根据该地址找到变量的存储

5、区,再对该存储区的内容进行存取,从而实现了对变量的间接访问。,8.1 指针的概念,东北大学信息科学与工程学院自动化所,10,一、指针变量的定义和赋值,1、格式:类型名 *指针变量名;,2、举例 int *p1; char *s1, *s2; float *a1, *a2, f;,3、说明 a. 类型名:指针变量所指向的变量类型。 b. * 是定义指针变量的标志,不可丢掉。 c. 指针变量定义后,其值是不确定的。,p1 是指针变量,指向整型,称整型指针变量,s1、s2 是指针变量,指向字符型,称字符型指针变量,a1、a2 是指针变量,指向浮点型,称浮点型指针变量,p1、s1、s2、a1、a2 值

6、是地址,值得类型为整型或长整型,8.2 指针变量的定义和引用,东北大学信息科学与工程学院自动化所,11,4、赋值:可以进行初始化,也可以使用赋值语句,(1)、初始化: int a, *s=,(2)、赋值语句 int a, *s; s=,8.2 指针变量的定义和引用,东北大学信息科学与工程学院自动化所,12,在分析有关指针的程序时,画图是很好的方法:,若有: int a, *s; 则,若有: int a=5, s= 则,8.2 指针变量的定义和引用,东北大学信息科学与工程学院自动化所,13,(3)、注意: 对指针变量初始化 int a, *s= 赋值为0的指针不指向任何对象,8.2 指针变量的定

7、义和引用,东北大学信息科学与工程学院自动化所,14,二、指针变量的引用,1、两个运算符: int *p1, *p2; p1= ,p1, int *p1,*p2,*p; p1= ,p1, int *p1,*p2; p1= ,p1, temp=x; x=y; y=temp; main() int a,b; scanf(%d,%d, ,例 将数从大到小输出,5,9,5,5,9,COPY,int x, int y,运行结果:5, 9,值传递,东北大学信息科学与工程学院自动化所,21,swap( ) int p; p=*p1; *p1=*p2; *p2=p; main() int a,b; int *p

8、ointer_1,*pointer_2; scanf(%d,%d, ,a,例 将数从大到小输出,int *p1, int *p2,运行结果:9,5,地址传递,5,b,9,point_1, int *p; p=,数组名是表示数组首地址的地址常量,一、指向数组元素的指针,8.3 数组的指针和指向数组的指针变量,东北大学信息科学与工程学院自动化所,23,二、指针的算术运算: pi p值 id p+ p- p+i p-i p+=i, p-=i 若p1与p2指向同一数组,p1-p2=(p1值-p2值)/d 两指针间元素个数 p1+p2 无意义,1,类型字节数,d字节,8.3 数组的指针和指向数组的指针变

9、量,东北大学信息科学与工程学院自动化所,24,例 p指向float数,则 p+1 p+1 4,例 p指向int型数组,且p= 则p+1 指向a1,例 int a10; int *p=,例 int a10; int *p1=,二、指针的算术运算:,8.3 数组的指针和指向数组的指针变量,东北大学信息科学与工程学院自动化所,25,三、通过指针引用数组元素,应用场合: 顺序访问指针法,速度快 随机访问下标法,直观,8.3 数组的指针和指向数组的指针变量,东北大学信息科学与工程学院自动化所,26,1,2,3,4,5,main() int a5,*p=a,i; for(i=0;i5;i+) scanf(

10、“%d”, p+); for(i=0;i5;i+,p+) printf(”%d: %dn,i, *p); ,注意指针的当前值,指针变量可以指到数组后的内存单元,思考,能不能将p+改为a+,东北大学信息科学与工程学院自动化所,27,例 数组元素的引用方法,main() int a5,*p,i; p=a; for(i=0;i5;i+) scanf(“%d”, ,p+i,a+i,*(a+i),pi,*(p+i), for(i=0;im;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); p

11、rintf(The array has been inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); ,例 将数组a中的n个整数按相反顺序存放,实参与形参均用数组名,m=5=n/2,void inv(int x, int n) int t,i,j; for(i=0,j=n-1;ij;i+,j-) t=xi; xi=xj; xj=t; ,东北大学信息科学与工程学院自动化所,31,例 将数组a中的n个整数按相反顺序存放,实参用数组名 形参用指针变量,void inv(int *x, int n) int t,i,j,m=n/2; for(i

12、=0;im;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); ,实参与形参都用指针变量,东北大学信息科学与工程学院自动化所,32,例 将数组a中的n个整数按相反顺序存放,实参与形参都用指针变量,void inv(int *x, int n) int t,i,j,m=n/2; for(i=0;im;i+) j=n-1-i;

13、t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; int *p=a; inv(p,10); printf(The array has been inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); ,实参用指针变量 形参用数组名,东北大学信息科学与工程学院自动化所,33,例 将数组a中的n个整数按相反顺序存放,实参用指针变量 形参用数组名,void inv(int x, int n) int t,i,j,m=n/2; for(i=0;im;i+) j=n-1-i; t=xi

14、; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; int *p=a; inv(p,10); printf(The array has been inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); ,东北大学信息科学与工程学院自动化所,34,prt(int*m,intn) int i; for(i=0;in;i+) mi+; main() int a=1,2,3,4,5,i; prt(a,5); for(i=0;i5;i+) printf(%d,ai); ,练习,程序运行后的输出结果是什么?,运行结果: 2,3,4,5,6,,东北大学信息科学与工程学院自动化所,35,每个元素ai是含有4个int 数的一维数组,int a34;,数组a由三个元素a0,a1 ,a2构成,五、指针与二维数组 二维数组的地址,8.3 数组的指针和指向数组的指针变量,东北大学信息科学与工程学院自动化所,36,对二维数组 int a34,有 a-二维数组的首地址,即第0行的首地址 a+i-第i行的首地址 ai *(a+i)-第i行第0列的元素地址 ai+j *(a+i)+j -第i行第j列的元素地址 *(ai+j) *(*(a+i)+j) aij,a+i=ai=*

温馨提示

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

评论

0/150

提交评论