《语言第十二讲.pptx》由会员分享,可在线阅读,更多相关《语言第十二讲.pptx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、6.1.1 内存、地址、指针内存、地址、指针 在计算机中所有的数据(包括程序和程序正在使用的数据)都存放在在计算机中所有的数据(包括程序和程序正在使用的数据)都存放在内存内存中,内中,内存的基本单元是字节存的基本单元是字节(Byte)。为了访问内存单元,进行数据的存取,为了访问内存单元,进行数据的存取,CPU给每个内存单元一个编号,该编号给每个内存单元一个编号,该编号称为内存单元的称为内存单元的地址地址。当说明变量时,系统将在内存中当说明变量时,系统将在内存中为其为其分配相分配相应的内存单元。由此确定变量的地址及内存中的应的内存单元。由此确定变量的地址及内存中的存储方式存储方式地址的分配由地址
2、的分配由C编译系统决定,编译系统决定,通过地通过地址运算符址运算符&可以获得。可以获得。2000H2001H2002H2003Hshort a=2;a的内存单元a的地址的地址&a 如果有一变量如果有一变量p,其中存放的是其中存放的是a的地址的地址&a,通过,通过p也可以间接访问也可以间接访问 a,则,则p称为称为指针指针,并并指向指向a。即。即P为指向变量为指向变量a的指针。的指针。p22000第1页/共19页6.1.2 指针变量的定义和引用指针变量的定义和引用 指针是指针是特殊类型的变量特殊类型的变量,其内容是变量的地址。,其内容是变量的地址。在使用前必须说明,说明某标在使用前必须说明,说明
3、某标识符是指针类型,并可指向某种类型的变量或数据结构。识符是指针类型,并可指向某种类型的变量或数据结构。1、指针变量的定义、指针变量的定义格式:格式:type *pname1,*pnamen;标识符命名的指针变量名标识符命名的指针变量名指针标志指针标志指针指向对象的类型指针指向对象的类型int *p,*q;/*/*p、q是指向整型变量的指针是指向整型变量的指针*/float *pfValue,*pf;/*/*pfValue和和pf是指向浮点型的指针是指向浮点型的指针*/第2页/共19页2、指针变量的初始化、指针变量的初始化 int a,*p=&a;或 int a;int *p=&a;初始化初始
4、化赋值语句赋值语句例:例:#include void main(void)int x,*p;x=55;p=&x;printf(“%d,%d,%Xn”,x,*p,p);*p=65;printf(“%d,%d,%Xn”,x,*p,p);2000Hxp2000H5565.int a=10,*p,*q;p=&a;q=p;第3页/共19页6.1.3 指针的运算及引用 定义指针定义指针 指针指向对象指针指向对象 通过指针引用对象通过指针引用对象指针操作运算符:int a,*p;2000Happ=&a;2000H*p=2;2&取地址运算符取地址运算符&a:取变量取变量a的的地址地址 *取值取值(指向指向)运
5、算符运算符*p:取指针取指针p指向的对象的值指向的对象的值1、指针变量的赋值运算、指针变量的赋值运算2、指针的引用(三个步骤)指针的引用(三个步骤)若定义:int a=10,*p=&a;指针引用含义:则:scanf(“%d”,p);scanf(“%d”,&a);printf(“%d”,*p);printf(“%d”,a);printf(“%x”,p);输出p的值(a的地址)。printf(“%x”,&p);输出p的地址。*p=5;a=5;(*p)+;a+;第4页/共19页注意:#include void main(void)int a,b,*p1,*p2;a=2;b=3;p1=&a;p2=&b
6、;*p1=*p2;printf(“%d,%dn”,a,b);a=3;b=5;p1=p2;printf(“%d,%d”,*p1,*p2);差差别别a&a 2000Hb&b 2400Hp1p2232000H2400H352400H例:例:3&和 *为互补运算。若若:int a,*p;p=&a;则:则:&*p p *&a a第5页/共19页3、指针的运算 指针是指针是特殊类型特殊类型的变量,其内容是的变量,其内容是变量的地址变量的地址,故指针的,故指针的运算及结果要符合地址逻辑。运算及结果要符合地址逻辑。五种算术运算五种算术运算int a,b,*p1,*p2;p1=&a;p2=&b;a2000Hb2
7、400Hp1p22000H2400Hp1+;/*指向指向a后的整型单元后的整型单元*/2004H2004Hp1-;/*指向指向a前的整型单元前的整型单元*/p1+n;/*指向指向a后的后的n个整型单元个整型单元*/p1-n;/*指向指向a前的前的n个整型单元个整型单元*/p2-p1;/*a和和b之间差的整型单元数之间差的整型单元数*/结果结果100Hpn 时编译系统实施的运算时编译系统实施的运算:p n sizeof(*p);六种关系运算六种关系运算比较两个同类型变量之间的地址关系。比较两个同类型变量之间的地址关系。p1=p2;p2p1;2000H类型长度 空运算空运算指针的特殊值指针的特殊值
8、NULL实际就是整数实际就是整数 0。P=NULL 指针指针赋空值,不指向任何对象。赋空值,不指向任何对象。第6页/共19页6.1.4 指针作为函数参数函数间数据的传递方式有两种:函数间数据的传递方式有两种:值传递:参数为变量或数组元素。值传递:参数为变量或数组元素。地址传递:地址传递:数组名或指针。数组名或指针。指指针针变变量量的的值值是是地地址址,指指针针作作为为函函数数的的参参数数在在函函数数间间传传送送的的是是变变量量的的地地址址(可可代代回多个计算结果回多个计算结果)。void swap(int*p1,int*p2)int t;t=*p1;*p1=*p2;*p2=t;void mai
9、n(void)int a,b;scanff(“%d,%d”,&a,&b);swap(&a,&b);printf(“a=%d,b=%d”,a,b);例:用指针作函数参数,编写两数交换的程序。例:用指针作函数参数,编写两数交换的程序。(p170例例6.3)a30Hb40Hp1p230H40H 6 8t 6 8 6第7页/共19页6.1.5 多级指针的概念 如果如果指针变量指针变量的内容存放的是其它的内容存放的是其它指针的地址指针的地址,称该,称该指针为指针为二级指针二级指针。同理可推广到三级指针、四级指针。同理可推广到三级指针、四级指针。二级指针(指向指针的指针)格式:type *p;int *p
10、;定义定义p是一个指向整形是一个指向整形指针的指针指针的指针。#include void main(void)int x,*p,*q;x=10;p=&x;q=&p;printf(“%dn”,*q);p为指向整型的指针。q为指向整型指针的指针。xpq2000H3000H102000H3000H思考:x、p、*p、q、*q=?第8页/共19页 课堂作业:#includevoid fun(int*a,int*b)int*k;k=a;a=b;b=k;void main()int a=3,b=6,*x=&a,*y=&b;fun(x,y);printf(%d%d,a,b);与与p170例例6.3比比较,要
11、实现两个较,要实现两个数交换,如何修数交换,如何修改程序改程序?分析下列程序运行结果(假设变量a,b的地址分别为20H,30H,画出程序执行后的内存示意图。见p201习题4)。编程题:用指针编写函数分别求二维方阵主、辅对角线上元素的和 sum1 和 sum2。要求:在主函数中输入a44,通过函数用指针求a44主、辅对角线元素的和。第9页/共19页6.2 指针与数组指针与数组 数组中的各元素按下标的顺序占据一段连续的内存空间,数组名是这段连续内存的首地址,指针访问数组元素非常方便。6.2.1 指针与一维数组1、用指针引用数组元素(三个步骤、用指针引用数组元素(三个步骤)说明指针和数组说明指针和数
12、组int *p,a10;指针指向数组指针指向数组p=a;/*指向数组的首地址指向数组的首地址*/p=&a0;/*指向数组的首地址指向数组的首地址*/通过指针引用数组元素通过指针引用数组元素例:通过指针引用数组元素 void main()int i,*p,a=1,2 3,4 5,6,7,8,9,10;for(p=a;p=a+10;p+)printf(“%4d”,*p);printf(“n”);注注 数组名是常量,意:意:不能赋值!a=p;/*Error!*/第10页/共19页2、一维数组元素的表示方法:当指针指向数组当指针指向数组int a10,*p=a;,则下标为则下标为i的元素的元素ai的地
13、址:的地址:p+i 或或a+i下标法:下标法:a i 指针法:指针法:*(p+i)或或 p i 地址法:地址法:*(a+i)此时引用数组元素可以有三种方法:此时引用数组元素可以有三种方法:若有定义:int a10,*p=a;则:元素地址元素地址 数组元素数组元素 元素地址元素地址 数组元素数组元素 a=&a0 *a=a0 p=&a0 *p=a0 a+1=&a1 *(a+1)=a1 p+1=&a1 *(p+1)=a1或:a+i=&ai *(a+i)=ai p+i=&ai *(p+i)=ai 或:p+;*p=a1;p+=i;*p=ai;第11页/共19页举例:用三种方法输出数组中的奇数举例:用三种
14、方法输出数组中的奇数(与与p175 例例6.8比较比较)。#include void main(void)int i,a 10;for(i=0;i10;i+)scanf(“%d”,&ai );for(i=0;i10;i+)if (a i%2 )printf(“%d”,a i);数组元素法。数组元素法。循环输入循环输入循环判断,满足条件输出。循环判断,满足条件输出。数组名法。数组名法。a+i*(a+i)指针法。指针法。,*p;p=a;p+*(p+i)结果是否结果是否正确?正确?p=a;*p=&a0;调整指针位置调整指针位置*注意指针在运算时的变化。注意指针在运算时的变化。*(a+i)*(p+i)
15、第12页/共19页6.2.3 指针与二维数组1、二维数组的地址、二维数组的地址如:如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;其二维结构为其二维结构为(按行优先按行优先转换为一维数组存放在内存转换为一维数组存放在内存):12345 6789101112行行列列为了便于索引,为了便于索引,C语言将数组分为语言将数组分为两级两级管理。管理。a0a1a2 将a理解为有三个元素a0、a1,a2的一维数组。各个元素又是一个有四个元素的一维数组。行地址(二级指针)列地址(一级)元素 a =&a0=&a00 *a =a0=&a00 a00=*a0=*a a+1=&a1=&a10
16、 *(a+1)=a1=&a10 a10=*a1=*(a+1)a+2=&a2=&a20 *(a+2)=a2=&a20 a20=*a2=*(a+2)a+i=&ai=&ai0 *(a+i)=ai=&ai0 ai0=*ai=*(a+i)(a0)4(a1)4(a2)4第13页/共19页数组名地址的两级管理:a ai=*(a+i)ai0=*ai=*(a+i)aa0a1a2a00 a01 a02a10 a11 a12a20 a21 a22 数组名是数组的地址,而且是常量,数组名是数组的地址,而且是常量,*运算不改变其值!运算不改变其值!故故a和和*a、(a+i)和和*(a+i)是相等的是相等的(级别不等)。
17、三种地址等价:三种地址等价:a+i*(a+i)a i 按按行行递递增增按列递增按列递增(a+0)+1=a+1*(a+0)+1=*a+1差别差别?a0+1第0行第一列地址第一行首址例:p178例6.9#includevoid main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;printf(%u,%u,%u,%un,a,*a,&a0,&a00);printf(%u,%u,%u,%un,a+1,&a10,*a+1,&a01);printf(%u,%u,%u,%un,a+1,*(a+1),a1,&a1);printf(%d,%d,%dn,*(*(a+1)+2),*(a1
18、+2),a12);printf(%d,%dn,*a1,*(a+1);第14页/共19页数组名表示二维数组元素:a i j*(*(a+i)+j)(*(a+i)j*(a i+j)2.用于二维数组的指针用于二维数组的指针 指向数组元素的指针(一级指针)int *p,a33;p=a0;则:则:aij 与与*(p+3*i+j)等价!等价!a00aa01a02a0a10a11a12a1a20a21a22a2a+1a1+2由于由于a+i *(a+i)ai 等价等价:int a33*(p+col*i+j)故故:对于二维数组对于二维数组 arowcol 的数组元素的数组元素aij可用可用位置表示法位置表示法:*
19、(&a00+col*i+j)或或:*(p+col*i+j)第15页/共19页举例:举例:输出二维数组输出二维数组a 中的元素。中的元素。#include void main(void)static int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i,j;int *p;p=a0;/*p=&a00*/for(i=0;i3;i+)for(j=0;j4;j+)printf(“a%d%d=%dn”,i,j,*(p+4*i+j);指针法指针法*(a i+j)*(*(a+i)+j)a i j 数组名法数组名法下标法下标法第16页/共19页 指向一维数组的指针(二级指针、行指针、
20、数组指针)例:输出二维数组例:输出二维数组a 的任意行、列的元素。的任意行、列的元素。main()int a34=0,1,2,3,4,5,6,7,8,9,10,11;int(*p)4,i,j;p=a;scanf(“%d,%d”,&i,&j);printf(“a%d%d=%d”,i,j,*(*(p+i)+j);格式:type(*pname)plen plen一维数组的长度一维数组的长度(即实际二维数组的列数)。即实际二维数组的列数)。注意:格式中格式中()()不可少,否则表示为指针数组。不可少,否则表示为指针数组。int(*p)4 定义定义p是一个是一个行行(二级二级)指针指针,它,它指向指向二
21、维数组二维数组a后,后,p+i就指向就指向a的各行的各行(含有4个元素的一维数组),此时前面用,此时前面用a表示数组元素的四种方式都可以用表示数组元素的四种方式都可以用p来代替来代替。*(p+i)+j 是二维数组是二维数组i行行j列的元素的列的元素的地址地址,而,而*(*(p+i)+j)则是则是i行行j列元列元素的素的值值。指针法指针法*(pi+j)pij第17页/共19页 思考题:作业题:作业题:p183 典型例题精解典型例题精解p188习题习题 一、选择题一、选择题 16。二、填空题二、填空题 13。三、程序运行题三、程序运行题4、5。四、程序填空题四、程序填空题1。五、程序设计题五、程序设计题 1。1.1.指针和数组名均为地址,两者的区别在哪里?指针和数组名均为地址,两者的区别在哪里?第18页/共19页感谢您的观看!第19页/共19页