《C语言复习第五章指针.ppt》由会员分享,可在线阅读,更多相关《C语言复习第五章指针.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章 指 针Chapter 5 Pointer第五章第五章 指指 针针PointerPointer第五章 指 针Chapter 5 Pointer5.1 指针的概念指针的概念 指针指针是是C语言的重要特征,是语言的重要特征,是C语言访问内存数据和程序的灵活语言访问内存数据和程序的灵活和有效的手段。和有效的手段。C C语言的指针支持:语言的指针支持:函数的地址调用;函数的地址调用;动态分配内存;动态分配内存;数组的地址引用。数组的地址引用。第五章 指 针Chapter 5 Pointer内存、地址、指针内存、地址、指针 (Memory,Address,Pointer)内存内存存放了计算机正在运
2、行的程序和程序正在使用的数据。内存放了计算机正在运行的程序和程序正在使用的数据。内存的基本单元是字节存的基本单元是字节(Byte)。为了访问内存单元,为了访问内存单元,CPU给每个内存单元一个编号,该编号称给每个内存单元一个编号,该编号称为该内存单元的为该内存单元的地址地址。变量变量是程序中可以改变的量,当说是程序中可以改变的量,当说明变量时,系统将为其在内存中开辟相明变量时,系统将为其在内存中开辟相应得内存单元。由此确定变量的应得内存单元。由此确定变量的地址地址及及内存中的表示方式。内存中的表示方式。2000H2001H2002H2003Hint a=0;a的的内内存存单单元元a的地址的地址
3、&a 如果有一变量如果有一变量p,其内容存放了其内容存放了a的的地址地址&a,通过,通过p也可实现对也可实现对a的访问,的访问,p称为指针,并指向称为指针,并指向a。00H20H00p第五章 指 针Chapter 5 Pointer指针的说明指针的说明 指针是特殊类型的变量,其内容是变量的地址。指针是特殊类型的变量,其内容是变量的地址。在使用前必须在使用前必须说明,说明某标识符是指针类型,并可指向某种类型的对象。说明,说明某标识符是指针类型,并可指向某种类型的对象。指针的说明格式:指针的说明格式:type *pname1,*pnamen;标识符命名的指针变量名。标识符命名的指针变量名。指针标志
4、。指针标志。指针指向对象的类型。指针指向对象的类型。int *p,*q;/*p、q是指向整型变量的指针。是指向整型变量的指针。*/float *pfValue,*pf;/*pfValue和和pf是指向浮点型的指针。是指向浮点型的指针。*/第五章 指 针Chapter 5 Pointer指针对变量的引用指针对变量的引用 定义指针的目的是通过指针引用内存对象,指针的引用应按如定义指针的目的是通过指针引用内存对象,指针的引用应按如下步骤进行:下步骤进行:说明指针说明指针 int a=0,*p;指针指向对象指针指向对象p=&a;通过指针引用对象通过指针引用对象*p=*p+2;指针操作的两种运算指针操作
5、的两种运算:取地址运算取地址运算&a表示取变量表示取变量a地址的运算。地址的运算。间接运算间接运算 *p表示取指针表示取指针p指向变量内容的运算。指向变量内容的运算。int a,*p;2000Happ=&a;/*p指向指向a。*/2000H*p=2;2第五章 指 针Chapter 5 Pointer举例:举例:#include void main(void)int x,*p;x=55;p=&x;printf(“%d,%u”,x,*p);*p=65;printf(“%d,%u”,x,*p);2000Hxp2000H5565关于指针的说明:关于指针的说明:指针必须指向对象后,才能引用。指针必须指向
6、对象后,才能引用。int *p;*p=2;/*Error!*/&和和*为互补运算。为互补运算。int a,*p;p=&a;则:则:&*p p *&a a第五章 指 针Chapter 5 Pointer指针的运算指针的运算 指针是指针是特殊类型特殊类型的变量,其内容是的变量,其内容是变量的地址,变量的地址,因此因此指针的运指针的运算及结果一定要符合地址逻辑。算及结果一定要符合地址逻辑。五种算术运算五种算术运算int a,b,*p1,*p2;p1=&a;p2=&b;a2000Hb2400Hp1p22000H2400Hp1+;/*含义指向含义指向a后的整型单元后的整型单元*/2002H2002Hp1
7、-;/*指向指向a前的整型单元前的整型单元*/p1+n;/*指向指向a后的第后的第n个整型单元个整型单元*/p1-n;/*指向指向a前的第前的第n个整型单元个整型单元*/p2-p1;/*a和和b之间差的单元数之间差的单元数*/结果结果200Hp n 相当于相当于:p的实际内容的实际内容 n sizeof(*p);六种关系运算六种关系运算比较两个同类型变量之间的地址关系。比较两个同类型变量之间的地址关系。p1p2;第五章 指 针Chapter 5 Pointer指针赋值运算#include void main(void)int a,b,*p1,*p2;a=2;b=3;p1=&a;p2=&b;*p
8、1=*p2;printf(“%d,%dn”,a,b);a=3;b=5;p1=p2;printf(“%d,%d”,*p1,*p2);差差别别a&a 2000Hb&b 2400Hp1p2232000H2400H第五章 指 针Chapter 5 Pointer5.2 指针与数组指针与数组 数组是同类型的变量的集合,各元素按下标的特定顺序占据一数组是同类型的变量的集合,各元素按下标的特定顺序占据一段连续的内存,段连续的内存,各元素的地址也连续,各元素的地址也连续,指针对数组元素非常方便。指针对数组元素非常方便。指针与一维数组指针与一维数组通过指针引用数组元素可以分以下三个步骤:通过指针引用数组元素可以
9、分以下三个步骤:说明指针和数组说明指针和数组int *p,a10;指针指向数组指针指向数组p=a;/*指向数组的首地址指向数组的首地址*/p=&a0;/*指向数组的首地址指向数组的首地址*/通过指针引用数组元素通过指针引用数组元素当指针指向数组的首地址时,则下标为当指针指向数组的首地址时,则下标为i的元素地址为:的元素地址为:p+i 或或a+i引用数组元素可以有三种方法:引用数组元素可以有三种方法:下标法:下标法:a i 指针法:指针法:*(p+i)数组名法:数组名法:*(a+i)注意:数组名是地址常量,不能改变!注意:数组名是地址常量,不能改变!a=p;/*Error!*/第五章 指 针Ch
10、apter 5 Pointer举例:打印数组中的奇数。举例:打印数组中的奇数。#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;*注意指针在运算时的变化。注意指针在运算时的变化。第五章 指 针Chapt
11、er 5 Pointer指针与字符串(字符数组)指针与字符串(字符数组)字符串在内存中可以存储为两种形式:字符串在内存中可以存储为两种形式:字符数组字符数组字符串常量字符串常量 可以使指针指向字符数组或字符串常量,通过指针引用字符数可以使指针指向字符数组或字符串常量,通过指针引用字符数组或字符串的各个字符。组或字符串的各个字符。v指针与字符数组:指针与字符数组:char *chp,str=”Hello!”;/*说明字符指针和字符数组说明字符指针和字符数组*/chp=str;/*指针指向字符数组指针指向字符数组*/putchar(*(chp+2);/*通过指针引用数组元素通过指针引用数组元素*/
12、v指针与字符串:指针与字符串:char *strp;/*说明字符指针说明字符指针*/strp=“Hello!”;/*指针指向字符串指针指向字符串*/puts(strp);/*通过指针引用字符串通过指针引用字符串*/说明指针时,可以同时赋初值,如:说明指针时,可以同时赋初值,如:char *strp=“Hello!”;赋值表示将字符串的地址赋给指针!赋值表示将字符串的地址赋给指针!第五章 指 针Chapter 5 Pointer举例:将字符串中的大写字母转化对应的小写字母。举例:将字符串中的大写字母转化对应的小写字母。#include void main(void)char *p,s80;p=s
13、;gets(p);for(;*p!=0;p+)if(*p=A&*p=Z)*p+=32;p=s;puts(p);第五章 指 针Chapter 5 Pointer将无符号的八进制字符串转换为十进制整数。将无符号的八进制字符串转换为十进制整数。#include void main(void)char *p,s6;int i,n=0;p=s;gets(p);for(;*p!=0;p+)n=n*8+*p-0;printf(“%dn”,n);p指向指向s数组。数组。输入字符串。输入字符串。sps5560n=0*8+5-05n=5*8+5-045n=45*8+6-0366Chap5ex5思考题:将思考题:将
14、4位十六进值字符串转化为十进制字符串。位十六进值字符串转化为十进制字符串。第五章 指 针Chapter 5 Pointer二维数组的地址二维数组的地址如下说明数组如下说明数组int a34=1,2,3,4,5,6,7,8,9,10,11,12;其二维结构如下:其二维结构如下:12345 6789101112行行列列为了便于索引,为了便于索引,C语言将数组分为两级管理。语言将数组分为两级管理。a0a1a2 将将a理解为一维数组,理解为一维数组,数组有三个元素,它们分别为数组有三个元素,它们分别为a0、a1,a2。各个元素又是一个有四个元素的一维数组。各个元素又是一个有四个元素的一维数组。从地址的
15、角度看:从地址的角度看:a 为为a0 第一行的首地址第一行的首地址a+1 为为a1 第二行的首地址第二行的首地址a+2 为为a2 第三行的首地址第三行的首地址a+1 地址一次加一行。地址一次加一行。i行行j列数组元素的地址可以由列数组元素的地址可以由a i+j得到。得到。第五章 指 针Chapter 5 Pointer数组名地址的两级管理数组名地址的两级管理aa0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23等价地址及其管理方式等价地址及其管理方式数组名是数组的地址,而且是常量,数组名是数组的地址,而且是常量,*运算不改变其值!运算不改变其值
16、!以下三种地址等价:以下三种地址等价:a+i*(a+i)a i 加加法法按按行行递递增增加法按列递增加法按列递增(a+1)+1*(a+1)+1差别?差别?第五章 指 针Chapter 5 Pointer 数组名表示数组元素数组名表示数组元素a i j(*(a+i)j*(*(a+i)+j)*(a i+j)指针与二维数组指针与二维数组int *p,a34;p=a;aij*(p+4*i+j)等价!等价!a00aa01a02a0a10a11a12a1a20a21a22a2a+1a1+2第五章 指 针Chapter 5 Pointer举例:举例:在数组在数组a中查找输入的数,输出行列位置。中查找输入的数
17、,输出行列位置。#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”,&iS);for(i=0;i3;i+)for(j=0;j4;j+)if(iS=a i j )printf(“iS equal to a%d%d n”,i,j);下标法。下标法。*(a i+j)*(*(a+i)+j)*(p+4*i+j)第五章 指 针Chapter 5 Pointer5.3 指指 针针 数数 组组 指针是存放其它数据对象地址的指针是存放其它数据对象地址的变量变量。因此,指针可以构成。
18、因此,指针可以构成数数组组。每个数组元素为一个指针变量,且在内存中连续存放。每个数组元素为一个指针变量,且在内存中连续存放。指针数组的说明指针数组的说明说明格式:说明格式:type *数组名数组名const exp;int *p 4;含义是含义是在内存中开辟空间,并指明元素所指向的对象的类型。在内存中开辟空间,并指明元素所指向的对象的类型。p 0 p 1 p 2 p 3 数组名数组名p为数组的地址。为数组的地址。使用前必须让各元素指向对象。使用前必须让各元素指向对象。int i,a34,*p3;for(i=0;i3;i+)p i=a i;*(p2+1)=2;/*通过指针数组引用数组元素通过指针
19、数组引用数组元素a21*/第五章 指 针Chapter 5 Pointer指针数组的应用举例指针数组的应用举例指针数组与多维数组指针数组与多维数组 通过指针数组按数学方式输出数组的值。通过指针数组按数学方式输出数组的值。#include void main()int i,j;int a34=1,2,3,4,5,6,7,8,9,10,11,12;int *p3;p0=a0;p1=a1;p2=a2;for (i=0;i3;i+)for(j=0;j4;j+)printf(“%5d”,*(pi+j);printf(“n”);123456789 101112 p0数组数组a的二维结构的二维结构p1p2a
20、0a1a2每输出一行,打印回车。每输出一行,打印回车。第五章 指 针Chapter 5 Pointer指针数组与多字符串指针数组与多字符串通过指针数组构成的菜单,执行通过指针数组构成的菜单,执行DOS命令。命令。#include void main(void)char*command =“dir”,“time”,“date”,ch;for(;)do printf(“1:directoryn”);printf(“2:set timen”);printf(“3:set daten”);printf(“4:quitn”);printf(nselection:”);ch=getchar();print
21、f(“n”);while (ch4);if(ch=4)break;system(commandch-1);内内层层循循环环输输入入选选项项外外层层循循环环根根据据选选项项执执行行命命令令执行系统命令函数,如执行系统命令函数,如:system(“dir”);dir0time0date0command0command1command23-1 2Chap5ex3第五章 指 针Chapter 5 Pointer5.4 指向指针的指针指向指针的指针 如果指针变量的内容存放其它指针的地址,称该指针为指向指如果指针变量的内容存放其它指针的地址,称该指针为指向指针的指针。针的指针。指向指针的指针的说明:指向指
22、针的指针的说明:形式:形式:type *p;int *p;p是一个指向整形指针的是一个指向整形指针的指针指针。#include void main(void)int x,*p,*q;x=10;p=&x;q=&p;printf(“%d”,*q);p为指向整型的指针。为指向整型的指针。q为指向整型指针的指针。为指向整型指针的指针。xpq2000H3000H102000H3000H第五章 指 针Chapter 5 Pointer指向指针的指针的应用指向指针的指针的应用指向指针的指针一般用于多维数组和指针数组的操作。指向指针的指针一般用于多维数组和指针数组的操作。多维数组多维数组#include vo
23、id 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;for(i=0;i3;i+)for(j=0;i4;j+)printf(“%5d”,*(*(p+i)+j );printf(“n”);aiaij123456789101112a0a1a2arrarrpp+1第五章 指 针Chapter 5 Pointer用于处理多字符串用于处理多字符串#include void main(void)char *name=“one”,“two”,“three”,“four”;char *p;int i;
24、for(i=0;i4;i+)p=name+i;printf(“%sn”,*p);name0name1name2name3pname+ione0two0three0four0第五章 指 针Chapter 5 Pointer5.5 指针的类型问题指针的类型问题 通过指针可以访问基本类型的变量及数组,指针的类型是其指通过指针可以访问基本类型的变量及数组,指针的类型是其指向数据的类型,该类型决定了指针逻辑加一时所加的物理字节数。向数据的类型,该类型决定了指针逻辑加一时所加的物理字节数。可以强制转换指针的类型,转换方式为:可以强制转换指针的类型,转换方式为:(type*)p#include void m
25、ain()char a3,*p;int y;a0=0 x12;a1=0 x34;a2=0 x56;p=&a0;y=*(int *)p;printf(“%xn”,y);0 x120 x340 x56a0a1a2&a0p 相邻单元转化相邻单元转化为一个整型单元。为一个整型单元。chp5ex2*p 第五章 指 针Chapter 5 Pointer指向void类型的指针 void称为称为“空类型空类型”,void不能说明变量。但可以用不能说明变量。但可以用void说明指说明指针。针。当用当用void说明指针时,指针称为指向空类型的指针,空类型指说明指针时,指针称为指向空类型的指针,空类型指针加针加1,地址移动一个字节。也就是说,地址移动一个字节。也就是说void指向的类型是以物理字节指向的类型是以物理字节为单位的内存。为单位的内存。