指针详解

上传人:给**** 文档编号:55911402 上传时间:2018-10-08 格式:PPT 页数:53 大小:802.50KB
返回 下载 相关 举报
指针详解_第1页
第1页 / 共53页
指针详解_第2页
第2页 / 共53页
指针详解_第3页
第3页 / 共53页
指针详解_第4页
第4页 / 共53页
指针详解_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《指针详解》由会员分享,可在线阅读,更多相关《指针详解(53页珍藏版)》请在金锄头文库上搜索。

1、第10章 指针,本章主要内容:1. 指针的基本概念2. 各种类型的指针:数组的指针、字符串的指针、函数的指针、指针的指针等,指针的优点:(1)可有效地表示复杂的数据结构;(2)动态分配内存;(3)方便地使用字符串,数组;(4)直接处理内存地址等。 指针的缺点:概念繁杂,使用时较灵活,不易掌握。,10.1 地址和指针的概念,在计算机中,所有的数据都是存放在存储器中的。 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等。为了正确地访问这些内存单元, 必须为每个内存单元编上号。 根据一个内存单元的编号即可准确地找到该内存单元。内

2、存单元的编号也叫做地址。 既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。,变量与地址,程序中: short i; float k;,内存中每个字节有一个编号-地址,i,k,变量是一块存储空间 变量的地址就是指针,10.1 地址和指针的概念,一、关于内存,内存单元的指针和内存单元的内容是两个不同的概念。对于一个内存单元来说,单元的地址即为指针, 其中存放的数据才是该单元的内容。在语言中, 允许用一个变量来存放指针,这种变量称为指针变量。因此, 一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。,二、关于变量的访问 1. 直接访问:根据变量名直接访

3、问变量。int i;i=3;printf(“%d”,i);2. 间接访问:将变量的地址存放于另一变量问题:如何获得一个变量的地址?如何保存一个变量的地址?,如何获得一个变量的地址?, 则&a获得变量的地址,如何保存一个变量的地址?,将变量的地址放在另一个(变量)中,三、若干术语1. 指针:一个变量的地址,称为该变量的指针。2. 指针变量:专门用来存放另一变量的地址(指针)的变量,称为指针变量。3. 指向:指针变量指向变量。,pt指向a,10.2 变量的指针和指向变量的指针变量一、指针变量的定义一般形式: 类型标识符 * 标识符;例如:float * pf;int * p1,* p2;说明: (

4、1)定义时,标识符前面的“ * ”表示该变量为指针变量,上例中变量名为p1,p2。 (2)类型标识符指出p1、p2所指向的变量的类型。,二、指针变量的引用 两个相关运算符: 1& 取地址运算符。,例: int a, *pt; 若: pt=&a,2* 指针运算符(间接访问运算符)*pt为指针变量pt所指向的变量.*pt等价于a*pt=10; 相当于a=10,pt指向a,例: main() int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer_1= ,a,b,pointer_1,pointer_2,100,10,&a,&b,例:输入两个整数a,b

5、,按大小顺序输出。main() int a,b,*p1,*p2,*p;scanf(“%d%d”,a,b,p1,p2,3,4,&b,p,&a,&a,&b,&a,注意: 1、指针变量必须先赋值,再使用,只能保存地址 例如:int *p,*p1,a=10;*p=20;printf(”%d”,*p1);,3、则: &a、pt 、 &*pt是等价的则: *&a、*pt、a 是等价的,2、一个指针变量只能指向同一类型的变量。 int a,*p;float f; p=,三、指针变量作为函数参数 实参形参:传去的是地址值,分占不同空间。1、指针变量作形参,在函数内部可以改变函数外部变量的值例:输入两个整数,从

6、大到小输出。,void swap(int*,int*); main() int a,b; int *p1,*p2;scanf(“%d,%d”, ,a,b,p1,p2,q1,q2,&a,&b,3,4,&a,&b,q,3,4,3,2、指针变量作形参,可以用来保存函数的返回值(输出型形参)例:写一个函数,功能是求出一维整型数组中的最大值和最小值。,void maxmin(int a, int n, int *pmax, int *pmin) int i; *pmax=*pmin=a0;for(i=1;i*pmax) *pmax=ai;if(ai*pmin) *pmin=ai; void main(

7、) int a10=0,9,-5,4,23,87,34,2,65,-45;int max,min;maxmin(a,10, ,课上练习,看程序写结果: void ast(int x,int y,int *cp,int *dp) *cp=x+y; *dp=x-y; void main() int a,b,c,d;a=4;b=3;ast(a,b, ,答案:7,1,10.3 数组的指针和指向数组的指针变量,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。 所谓数组元素

8、的指针就是数组元素的地址。,一、指向数组元素的指针 1.定义: int a10,*p; 注意:如果数组为int型,则指针变量的基类型亦应为int型。2. 赋值: p=,把0元素的地址赋给指针变量。也就是使指向数组的第号元素,如图:,说明:c语言规定数组名(不包括形参数组名),代表数组中首元素(下标为0的元素)的地址。p= */ 习题集第七单元 一、8,9,10,36,二、通过指针引用数组元素 int a10,*p; 若p=a; 则*p=1 等价于 a0=1 p+1含义是什么?C中规定:若p=&a0, 则p+1指向下一个元素,不是简单的 加1。,因此,如果int a10,*p;p=a;则有以下关

9、系:(1) p+i a+i &ai。(2) *(p+i) *(a+i) ai。(3) 指向数组元素的指针变量也可带下标:pi *(p+i) 。即有*(p+i) *(a+i) ai pi,练习(习题集7单元二、3),阅读程序,写结果 void main() int a =2,4,6,8,10;int y=1,x,*p;p= ,y=19,例:输出数组中全部元素。 (设a数组,整型,10个元素),(1)下标法 void main ( ) int a10;int i;for (i=0;i10;i+)scanf(“%d“, ,(2)用数组名计算数组元素地址法void main ( ) int a10;i

10、nt i;for (i=0;i10;i+)scanf(“%d“,a+i);printf(“n“);for (i=0;i10;i+)printf(“%3d“,*(a+i); ,(3)用指针变量法1:main( ) int *p,i,a10;p= ,/ p=a;,/ p=a;,用指针变量法2 main( ) int *p,i,a10;p=a;for(i=0;i10;i+)scanf(“%d“, p+);printf(“n“); for (p=a;p(a+10);p+)printf(“%3d“,*p ); ,3,5,-4,12,在使用指针变量时应注意的几个问题:1. 数组名是数组的首地址,因此 p=

11、&a0 与 p=a 等价。2指针变量可以实现使本身的值改变,数组名不可以。例: p+正确 a+不正确3要注意指针变量的当前值,指针变量可以指到数组后的内存单元。即指针变量的越界问题4注意指针变量的运算,若先使p指向数组a(即p=a),则(1) p+ (或p+=1) 指向下一个元素。(2) *p+等价于*(p+)先得到p指向的变量的值,p再加1。(3) *(p+)与*(+p)作用不同,前者先取*p,后使p加1;后者相反。(4) (*p)+表示p所指向的元素值加1。(5) 若p当前指向a数组第i个元素,则:*(p-)相当于ai-,先取p值作“*“运算,再使p自减;*(+p)相当于a+i,先使p自加

12、,再作“*“运算;*(-p)相当于a-i,先使p自减,再作“*“运算。,void main() int a10,b10,i;int *pa,*pb;pa=a;pb=b;for(i=0;i10;i+)scanf(“%d”,pb+);pb=b; /*必不可少,否则出现越界*/for(i=0;i10;i+) *pa=*pb;pa+;pb+;pa=a; /*必不可少,否则出现越界*/for(i=0;i10;i+)printf(“%5d”,*pa+); ,例:编程实现把整型数组b中的所有元素拷贝到数组a中。,习题集第七单元 一、1,14,15,16,17,18,19,20,二、数组名作函数参数(P235

13、),内容回顾: 数组名做函数参数,当发生函数调用时实参传递给形参是什么?,int sum(int arr,int n) int s=0,i;for(i=0;in;i+)s+=ai;return s; ,void main() int array5=1,2,3,4,5,i,s;s=sum(array,5);printf(“sum=%dn”,s); ,实参传递给形参是实参数组的首地址 实际上,形参数组名就是一个指针变量int sum(int arr,int n)等价于int sum(int * arr,int n),2,3,4,7,9,void inv(int *x, int n),例10.7:将

14、数组a中n个整数按相反顺序存放。,void inv(int x, int n),void inv(int *x, int n) int temp,*p1,*p2,m;m=n/2;p1=x; p2=x+n-1;for ( ;p1x+m;p1+,p2-) temp=*p1;*p1=*p2;*p2=temp; ,void main() int a5=1,2,3,4,5;int i;inv(a,5);for(i=0;i5;i+)printf(“%4d”,ai); ,如果有一个实参数组,想在函数中改变此数组,实参与形参的对应关系有以下几类情况:,例10.9:用选择法对10个整数排序。,void sort

15、(int x, int n) int i,j,k,t;for (i=0;ixk) k=j;if (k!=i) t=xi; xi=xk; xk=t; ,main ( ) int *p,i,a10;p=a;for (i=0;i10;i+)scanf(“%d“,p+);p=a;sort(p,10);for (p=a,i=0;i10;i+)printf(“%d“,*p+); ,(1) 形参用数组名, 实参用指针变量,sort(a,10);也行,(2) 形参用指针变量, 实参用数组名,void sort(int *x, int n) int i,j,k,t;for (i=0;i*(x+k) k=j;if (k!=i) t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;,main ( ) int i,a10;for (i=0;i10;i+)scanf(“%d“, ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 理学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号