第五章指针.ppt

上传人:本田雅阁 文档编号:3118525 上传时间:2019-07-12 格式:PPT 页数:25 大小:2.56MB
返回 下载 相关 举报
第五章指针.ppt_第1页
第1页 / 共25页
第五章指针.ppt_第2页
第2页 / 共25页
第五章指针.ppt_第3页
第3页 / 共25页
第五章指针.ppt_第4页
第4页 / 共25页
第五章指针.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《第五章指针.ppt》由会员分享,可在线阅读,更多相关《第五章指针.ppt(25页珍藏版)》请在三一文库上搜索。

1、第五章 指 针 Pointer,5.1 指针的概念,指针是C语言的重要特征,是C语言访问内存数据和程序的灵活 和有效的手段。,C语言的指针支持: 函数的地址调用; 动态分配内存; 数组的地址引用。,内存、地址、指针 (Memory ,Address, Pointer),内存存放了计算机正在运行的程序和程序正在使用的数据。内 存的基本单元是字节(Byte)。,为了访问内存单元,CPU给每个内存单元一个编号,该编号称 为该内存单元的地址。,变量是程序中可以改变的量,当说 明变量时,系统将为其在内存中开辟相 应得内存单元。由此确定变量的地址及 内存中的表示方式。,2000H,2001H,2002H,

2、2003H,int a=0;,a 的 内 存 单 元,a的地址&a,如果有一变量p,其内容存放了a的 地址&a,通过p也可实现对a的访问,p 称为指针,并指向a。,00H,20H,0,0,p,指针的说明,指针是特殊类型的变量,其内容是变量的地址。在使用前必须 说明,说明某标识符是指针类型,并可指向某种类型的对象。,指针的说明格式: type *pname1,*pnamen;,标识符命名的指针变量名。,指针标志。,指针指向对象的类型。,int *p, *q; /* p、q是指向整型变量的指针。*/,float *pfValue ,*pf; /* pfValue和pf是指向浮点型的指针。*/,指针

3、对变量的引用,定义指针的目的是通过指针引用内存对象,指针的引用应按如 下步骤进行:,说明指针,int a=0, *p;,指针指向对象,p=,通过指针引用对象,*p=*p+2;,指针操作的两种运算:,取地址运算 & &a表示取变量a地址的运算。,间接运算 * *p表示取指针p指向变量内容的运算。,int a,*p;,2000H,a,p,p= /* p指向a。 */,2000H,*p=2;,2,举例:,#include void main (void ) int x ,*p; x=55; p= ,2000H,x,p,2000H,55,65,关于指针的说明:,指针必须指向对象后,才能引用。,int

4、*p; *p=2; /* Error! */, &和 * 为互补运算。,int a,*p; p= 则:&*p p *&a a,指针的运算,指针是特殊类型的变量,其内容是变量的地址,因此指针的运 算及结果一定要符合地址逻辑。,五种算术运算,int a, b, *p1, *p2; p1=,a,2000H,b,2400H,p1,p2,2000H,2400H,p1+; /*含义指向a后的整型单元*/,2002H,2002H,p1- -; /*指向a前的整型单元*/,p1+n; /*指向a后的第n个整型单元*/,p1- n; /*指向a前的第n个整型单元*/,p2- p1; /*a和b之间差的单元数*/

5、,结果 200H,p n 相当于: p的实际内容 nsizeof(*p);,六种关系运算,比较两个同类型变量之间的地址关系。,p1p2;,指针赋值运算,#include void main(void) int a,b,*p1,*p2; a=2; b=3; p1= ,差别,a,&a 2000H,b,&b 2400H,p1,p2,2,3,2000H,2400H,5.2 指针与数组,数组是同类型的变量的集合,各元素按下标的特定顺序占据一 段连续的内存,各元素的地址也连续,指针对数组元素非常方便。,指针与一维数组,通过指针引用数组元素可以分以下三个步骤:,说明指针和数组,int *p,a10;,指针指

6、向数组,p=a; /*指向数组的首地址*/ p= /*指向数组的首地址*/,通过指针引用数组元素,当指针指向数组的首地址时,则下标为i的元素地址为: p+i 或a+i,引用数组元素可以有三种方法:,下标法: a i 指针法: *(p+i) 数组名法:*(a+i),注意:数组名是地址常量,不能改变!,a=p; /*Error!*/,举例:打印数组中的奇数。,#include void main(void ) int i ,a 10 ; for (i=0 ; i10 ; i+ ) scanf ( “ %d” , ,数组元素法。,循环输入。,循环判断,满足条件输出。,数组名法。,a+i,*(a+i)

7、,指针法。,*p ;,p = a;,p+,*(p+i),结果是否 正确?,p= a; *p=*,注意指针在运算时的变化。,指针与字符串(字符数组),字符串在内存中可以存储为两种形式:,字符数组 字符串常量,可以使指针指向字符数组或字符串常量,通过指针引用字符数 组或字符串的各个字符。,指针与字符数组:,char *chp,str =”Hello!”; /*说明字符指针和字符数组*/ chp=str; /*指针指向字符数组*/ putchar( *(chp+2); /*通过指针引用数组元素*/,指针与字符串:,char *strp; /*说明字符指针*/ strp=“Hello!”; /*指针指

8、向字符串*/ puts(strp); /*通过指针引用字符串*/,说明指针时,可以同时赋初值,如:,char *strp=“Hello!”;,赋值表示将字符串的地址赋给指针!,举例:将字符串中的大写字母转化对应的小写字母。,#include void main(void) char *p,s80; p=s; gets(p); for(;*p!=0;p+) if(*p=A ,将无符号的八进制字符串转换为十进制整数。,#include void main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; pr

9、intf(“%dn”,n); ,p指向s数组。,输入字符串。,s,p,s,5,5,6,0,n=0*8+5-05,n=5*8+5-045,n=45*8+6-0366,Chap5ex5,思考题:将4位十六进值字符串转化为十进制字符串。,二维数组的地址,如下说明数组 int a34=1,2,3,4,5,6,7,8,9,10,11,12;,其二维结构如下:,行,列,为了便于索引,C语言将数组分为两级管理。,a0,a1,a2,将a理解为一维数组, 数组有三个元素,它们分别为a0、 a1,a2 。各个元素又是一个有四个元素的一维数组。,从地址的角度看: a 为a0 第一行的首地址 a+1 为a1 第二行的

10、首地址 a+2 为a2 第三行的首地址,a+1 地址一次加一行。,i行j列数组元素的地址可以由a i +j得到。,数组名地址的两级管理,a,a0,a1,a2,a00 a01 a02 a03,a10 a11 a12 a13,a20 a21 a22 a23,等价地址及其管理方式,数组名是数组的地址,而且是常量,* 运算不改变其值!,以下三种地址等价:,a+i,*(a+i),a i ,加法按行递增,加法按列递增,(a+1)+1,*(a+1)+1,差别?,数组名表示数组元素,a i j ,(*(a+i) j ,*(*(a+i)+j),*(a i +j),指针与二维数组,int *p, a34; p=a

11、; aij *(p+4*i+j)等价!,a00,a,a01,a02,a0,a10,a11,a12,a1,a20,a21,a22,a2,a+1,a1+2,举例: 在数组a中查找输入的数,输出行列位置。,#include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d” , ,下标法。,*(a i +j),*(*(a+i)+j),*(p+4*i+j),5.3 指 针 数 组,指针是存放其它数据对象地址的变量。因此,指针可以构成数 组。每个数组元素为一个指针变量,且

12、在内存中连续存放。,指针数组的说明,说明格式: type *数组名const exp;,int *p 4 ;,含义是在内存中开辟空间,并指明元素所指向的对象的类型。,数组名p为数组的地址。,使用前必须让各元素指向对象。,int i, a34, *p3; for(i=0;i3;i+) p i =a i ; *(p2+1)=2; /*通过指针数组引用数组元素a21*/,指针数组的应用举例,指针数组与多维数组,通过指针数组按数学方式输出数组的值。,#include void main ( ) int i , j; int a34= 1,2,3,4, 5,6,7,8, 9,10,11,12 ; int

13、 *p3; p0 = a0; p1 = a1 ; p2 = a2; for (i=0 ; i3 ; i+) for (j=0; j4; j+) printf (“ %5d” , *(pi+j); printf ( “n” ) ; ,p0,数组a的二维结构,p1,p2,a0,a1,a2,每输出一行,打印回车。,指针数组与多字符串,通过指针数组构成的菜单,执行DOS命令。,#include void main(void ) char *command = “dir”, “time”, “date”, ch ; for ( ; ; ) do printf (“1: directoryn”) ; pr

14、intf (“2:set timen” ) ; printf (“3:set daten”) ; printf (“4:quitn”) ; printf (nselection:”) ; ch =getchar( ) ; printf (“n”) ; while (ch4) ; if (ch=4) break; system (commandch-1) ; ,内层循环输入选项,外层循环根据选项执行命令,执行系统命令函数,如:system(“dir”);,3-1 2,Chap5ex3,5.4 指向指针的指针,如果指针变量的内容存放其它指针的地址,称该指针为指向指 针的指针。,指向指针的指针的说明

15、:,形式: type *p;,int *p;,p是一个指向整形指针的指针。,#include void main ( void) int x, *p, *q ; x=10; p= ,p为指向整型的指针。,q为指向整型指针的指针。,x,p,q,2000H,3000H,10,2000H,3000H,指向指针的指针的应用,指向指针的指针一般用于多维数组和指针数组的操作。,多维数组,#include void main ( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12, ; int *arr3 = a0 , a1 , a2 ; int i ,j, *p ; p=arr ;

16、for (i=0 ;i3; i+) for (j=0 ; i4 ; j+) printf(“%5d” , *( *(p+i)+ j ) ) ; printf (“n”) ; ,ai,aij,arr,arr,p,p+1,用于处理多字符串,#include void main (void) char *name = “one” , “two” , “three” , “four” ; char *p ; int i ; for ( i=0 ; i4 ; i+) p=name+i ; printf (“%sn”, *p) ; ,p,name+i,5.5 指针的类型问题,通过指针可以访问基本类型的变量

17、及数组,指针的类型是其指 向数据的类型,该类型决定了指针逻辑加一时所加的物理字节数。,可以强制转换指针的类型,转换方式为:,(type *) p,#include void main( ) char a3, *p ; int y; a0=0x12 ; a1=0x34 ; a2=0x56 ; p= ,&a0,p,相邻单元转化为一个整型单元。,chp5ex2,*p,指向void类型的指针,void称为“空类型”,void不能说明变量。但可以用void说明指 针。,当用void说明指针时,指针称为指向空类型的指针,空类型指 针加1,地址移动一个字节。也就是说void指向的类型是以物理字节 为单位的内存。,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1