程序设计(C语言).ppt
《程序设计(C语言).ppt》由会员分享,可在线阅读,更多相关《程序设计(C语言).ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第8章章 指针指针 1.存储单元存储单元:构成存储单元的基本单位是字节,不同类型的存储单构成存储单元的基本单位是字节,不同类型的存储单元由数量不等的连续字节组成,计算机给每个字节一个惟一的编元由数量不等的连续字节组成,计算机给每个字节一个惟一的编号。号。2.指针指针:构成某一存储单元的连续字节的起始字节编号称为该存储构成某一存储单元的连续字节的起始字节编号称为该存储单元的地址,也称为该存储单元对应变量的指针。即:变量的指单元的地址,也称为该存储单元对应变量的指针。即:变量的指针就是变量的地址针就是变量的地址 8.1.1 8.1.1 指针的概念指针的概念如果有:如果有:int a=5;则内存情
2、况如图则内存情况如图8-1所示。所示。a是是存储单元(即变量)的名字存储单元(即变量)的名字,5是存放在是存放在存储单元中的内容存储单元中的内容,存储单元的地址存储单元的地址是是2000。52000a2001图8-18.1.2 指针变量指针变量n指针变量指针变量:存放某一变量的地址的变量称为存放某一变量的地址的变量称为指针变量指针变量。n指针变量的一般指针变量的一般定义形式定义形式如下:如下:类型标识符类型标识符 *标识符标识符;例例:int*p;n允许指针变量在定义中初始化。允许指针变量在定义中初始化。例如:例如:int a=5,*p=&a;/*&a 是变量是变量a的地址的地址*/其示意图其
3、示意图如图如图所示所示(图图2):n注意:此语句是将注意:此语句是将&a赋给赋给p,而不是,而不是*p。52000a20012000pint a=5,*p=&a;图8-28.1.3 指针变量的运算1赋值运算赋值运算n不能直接给一个指针变量赋一个整数不能直接给一个指针变量赋一个整数 n变量的地址变量的地址是通过对变量取地址运算得到的。是通过对变量取地址运算得到的。&变量名变量名“&”是对变量取地址运算符,其作用是取得变量所占用是对变量取地址运算符,其作用是取得变量所占用的存储单元的地址(构成存储单元的连续字节的首字的存储单元的地址(构成存储单元的连续字节的首字节编号)。节编号)。8.1.3 指针
4、变量的运算指针变量的运算n对指针变量的赋值是将另一变量的地址赋给指针变量。对指针变量的赋值是将另一变量的地址赋给指针变量。其一般格式有如下四种:其一般格式有如下四种:指针变量名指针变量名=&变量名变量名 指针变量名指针变量名=指针变量名指针变量名 指针变量名指针变量名=指针变量名指针变量名+整型数据值整型数据值 指针变量名指针变量名=指针变量名指针变量名-整型数据值整型数据值8.1.3 指针变量的运算指针变量的运算n例如:例如:int a,i=1;int *p,*q,*m,*n;p=&a;q=p;m=p+1;n=q-i;2020a20222023202420252021&ap&aqq-1np+
5、1m8.1.3 指针变量的运算指针变量的运算2取指针变量指向的存储单元(或变量)运算*指针数据值n如果有:int a;int *p;p=&a;n则:*p与a是相同的,表示同一个变量。可以是常量、变量或表达式 8.1.3 指针变量的运算指针变量的运算n“&”和“*”互为逆运算,但首先进行的运算是取地址,即“&”运算。n如果有:int a=3,b;int *p;p=&a;b=*p;*p=5;n则:指针变量p指向变量a;*p(即a)的值赋给b,b的值为3;将5赋给*p(即a),a的值为5。8.1.3 指针变量的运算指针变量的运算3比较运算当两个基类型相同的指针变量已被正确赋值后,可以对指针变量的值进
6、行比较运算。如果有:int a6;int*p,*q;p=&a0;q=&a5;指针变量p、q的指向如图8-4所示。此时,对p、q进行比较运算,则有:pq、p=q、p=q的值为假;pq、p=q、p!=q的值为真。a0a2a3a4a5a1pq图图8-48.1.3 指针变量的运算指针变量的运算4减法运算两个指针变量在一定条件下,可进行减法运算。设p,q指向同一数组,则p-q的绝对值表示p所指对象与q所指对象之间的元素个数。n如果有:如果有:char a10=Hello;char*p,*q;int n;p=&a0;q=&a5;n=q-p;n指针变量指针变量p、q的指向的指向如图如图8-5所示,则:所示,
7、则:n=5。a0a2a3a4a5a1pqHllone图8-58.1.3 指针变量的运算指针变量的运算8.1.3 指针变量的运算指针变量的运算5指针变量的运算应用举例指针变量的运算应用举例例例8.1 输入输入a和和b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a和和b。#includemain()int*p1,*p2,*p,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%dn,*p1,*p2);8.2.1 指针与一维数组指针与一维数
8、组一、一维数组与指针一、一维数组与指针n定义一维数组与指针。定义一维数组与指针。例:例:int a5,*p;则则a为首地址为首地址常量常量,其对象类型为,其对象类型为int*;a值与值与&a0的的值完全相同值完全相同若有若有p=a;/*或或p=&a0;*/则有则有2.地址等价关系地址等价关系 a+i p+i&ai&pi3.对象等价关系对象等价关系*(a+i)*(p+i)ai pi注意注意:一维指针变量可以当作一维数组名来引用对象:一维指针变量可以当作一维数组名来引用对象,如如:p=a+2;则则p0a2,p1a3,二、应用举例例例8.2用用不不同同的的方方法法对对有有10个个元元素素的的整整型型
9、数数组组进进行行输输入入输输出。出。方法一:下标法。方法一:下标法。&aiai方法二:地址法。方法二:地址法。a+i*(a+i)方法三:引入指针变量的地址法。方法三:引入指针变量的地址法。int*p;p=a;p+i*(p+i)方法四:引入指针变量的下标法。方法四:引入指针变量的下标法。int*p;p=a;pi;方法五:指针变量发生变化的下标法。方法五:指针变量发生变化的下标法。int*p;p=a;p+*p+8.2.1 指针与一维数组指针与一维数组p+;/*相当于相当于p=p+1;*/特殊表达式:特殊表达式:*p+;和和*p-;先取用对象(先取用对象(*p),然后然后p自加减自加减1+*p;与与
10、*+p;完全相同完全相同-*p;与与*-p;完全相同完全相同,这四种形式都是这四种形式都是p先自加减先自加减1,然后,然后再取用对象再取用对象等价于*(p+)不等价于(*p)+注意:注意:8.3.2指针与二维数组指针与二维数组 一、二维数组与指针一、二维数组与指针例例intb35;可理解为可理解为:b是数组名是数组名.b是数组首地址是数组首地址.b数组包含三个元素数组包含三个元素:b0,b1,b2;而而每个元素又是一个一维数组每个元素又是一个一维数组.则则:b&b0表数组首地址表数组首地址.*bb0&b00代表数组首元素地址代表数组首元素地址.*(b+i)bi&bi0代表第代表第i行行0列元素
11、的地址列元素的地址.b0b1b2b00b01b02b03b04b10b11b12b13b14b20b21b22b23b24bb+1b+2则则:b&b0表数组首地址表数组首地址.*bb0&b00代表数组首元素地址代表数组首元素地址.*(b+i)bi&bi0代表第代表第i行行0列元素的地址列元素的地址.*(b+i)+jbi+j&bij第第i行行0列元素的地址列元素的地址注注:数组首地址值数组首地址值:b=*b=b0=&b0=&b00第第i行首地址行首地址:b+i=*(b+i)=bi=&bi=&bi0二维数组与一级指针变量二维数组与一级指针变量intb35,*p;一般给一般给p赋初值为数组首元素地址
12、赋初值为数组首元素地址:p=&b00或或p=b0或或p=*b或或p=b;则则bij可用指针表示为可用指针表示为:*(p+5*i+j)或或p5*i+j列数列数b0b1b2b00b01b02b03b04b10b11b12b13b14b20b21b22b23b24bb+1b+2pp+1p+4p+5例例8.3用指向二维数组元素的指针变量处理二维数组的输入输出。用指向二维数组元素的指针变量处理二维数组的输入输出。程序一:程序一:#includemain()int a34;int*p,i,j;p=a0;for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,(p+i*4+j);for(i
13、=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(p+i*4+j);printf(n);8.3.2指针与二维数组指针与二维数组 程序二:程序二:#includemain()int a34;int*p,i,j;for(p=a0;pa0+12;p+)scanf(%d,p);for(p=a0;pa0+12;p+)if(p-a0)%4=0)printf(n);printf(%4d,*p);8.3.2指针与二维数组指针与二维数组(2 2)指向一个由)指向一个由n n个元素组成的一维数组的指针变量。个元素组成的一维数组的指针变量。又称又称行指针变量行指针变量,或,或数组指针数组指针。
14、其定义形式如下:其定义形式如下:类型说明符类型说明符 (*p)n;说明:说明:1)类型说明符是指向一维数组元素的类型。)类型说明符是指向一维数组元素的类型。2)该语句定义了一个指针变量)该语句定义了一个指针变量p。3)指针变量)指针变量p的基类型是由的基类型是由n个元素组成的一维数组类型。个元素组成的一维数组类型。行指针变量与二维数组行指针变量与二维数组(二)(二)二维数组与二维数组与行指针行指针例例:intb35;int(*p)5;则则:b是可以看作是一个二级指针常量是可以看作是一个二级指针常量;p是可以看作是一个二级指针变量是可以看作是一个二级指针变量;通常通常给给p赋值为赋值为:p=b或
15、或p=b+i则则p每增每增1是移动到下一行。是移动到下一行。则则:bij的的 地地 址址:*(b+i)+j=bi+j=pi+j=&pij=&bij=*(p+i)+j列数列数b0b1b2b00b01b02b03b04b10b11b12b13b14b20b21b22b23b24bb+1b+2pp+1行指针变量与二维数组行指针变量与二维数组例例8.4用指向一维数组的指针变量处理二维数组的输入输出。用指向一维数组的指针变量处理二维数组的输入输出。程序一:程序一:#includemain()int a34;int(*p)4,i,j;p=a;for(i=0;i3;i+)for(j=0;j4;j+)scan
16、f(%d,(*(p+i)+j);for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(*(p+i)+j);printf(n);程序二:程序二:#includemain()int a34;int(*p)4,i,j;p=a;for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,(pi+j);for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,pij);printf(n);行指针变量与二维数组8.3.3 指针数组n数组元素为指针类型的数组称为指针数组。数组元素为指针类型的数组称为指针数组。n指针数组的定义形式如下:指针数组的定
17、义形式如下:类型说明符类型说明符 *标识符标识符常量表达式常量表达式;如果有:如果有:int *q3;则指针数组则指针数组q可以用图可以用图8-14所示所示 q0q1q2202020082034202020342022200820102036图8-14说明:说明:(1)类型说明符是数)类型说明符是数组元素存储的地址的组元素存储的地址的基类型。基类型。(2)“*”表示数组表示数组的元素值是地址,即的元素值是地址,即元素类型为指针类型。元素类型为指针类型。(3)标识符是指针数)标识符是指针数组的名字。组的名字。(4)常量表达式表示)常量表达式表示指针数组的大小。指针数组的大小。使用指针数组来处理二
18、维数组。使用指针数组来处理二维数组。例如:如果有:例如:如果有:int a34;int*b3,i,j;for(i=0;i3;i+)bi=ai;则有如图8-15所示的存储关系。a23a22a21a20a03a02a01a00a13a12a11a10b0b1b2图图8-15n此时,二维数组此时,二维数组a中任一元素中任一元素aij的地址可用指针数组的地址可用指针数组b表示如下:表示如下:bi+j *(b+i)+j n相应地,二维数组相应地,二维数组a中任一元素中任一元素aij可用指针数组可用指针数组b表示为:表示为:*(bi+j)bij*(*(b+i)+j)*(b+i)j a23a22a21a20
19、a03a02a01a00a13a12a11a10b0b1b2注意:注意:n(1)从从以以上上用用指指针针数数组组表表示示二二维维数数组组的的形形式式看看,其其用用法法与与用用数数组组指指针针(指指向向一一维维数数组组的的指指针针)相相似似,但但要要注注意意两两者者的的概概念念是是不不同同的的,指指针针数数组组是是由由多多个个元元素素组组成成的的,即即有有多多个个变变量量,指指针针数数组组名名是是一一个个地地址址常常量量,而而数数组组指指针针是是指指向一维数组的指针,是一个变量。向一维数组的指针,是一个变量。n(2)指针数组和数组指针的定义形式是不同指针数组和数组指针的定义形式是不同的:的:in
20、t*p3;定义定义p是一个指针数组;是一个指针数组;int(*p)3;定义定义p是一个数组指针。是一个数组指针。指针数组与数组指针用指针数组处理二维数组。用指针数组处理二维数组。例例8.5用指针数组处理二维数组。用指针数组处理二维数组。#includemain()int a34=1,3,5,7,9,11,2,4,6,8,10,12;int*b3,i,j;for(i=0;i3;i+)bi=ai;for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,bij);printf(n);8.3.4指针与字符串指针与字符串 一用字符指针表示字符串字符指针的定义:字符指针的定义:cha
21、r*字符指针变量名字符指针变量名;例例1:#includemain()char*str=“I am happy”;printf(“%s”,str);0I am happystr二、二、字符数组与指针变量字符数组与指针变量1.赋初值赋初值staticcharstr=”Ilovechina!”;(静态或外部类静态或外部类)char*a=”Ilovechina!”;(不必要求为静态或外部类不必要求为静态或外部类)2.赋值赋值char*a;a=”Ilovechina!”;(正确正确)charstr14;str=”Ilovechina!”(错误错误)3.输入字符串输入字符串charstr10;scanf
22、(“%s”,str);或或gets(str);(正确正确)char*a;scanf(“%s”,a);(错误错误)8.3.4 指针与字符串指针与字符串 用指针输入字符串正确的做法应是用指针输入字符串正确的做法应是:charstr10;char*a;a=str;scanf(“%s”,a);gets(a);或或a=(char*)malloc(10);scanf(“%s”,a);8.3.4 指针与字符串 输出字符串输出字符串char*s=”Iamastudent”;puts(s);或或printf(“%sn”,s);charstr=”Iamastudent!”;puts(str);或或printf(“
23、%sn”,str);8.3.4 指针与字符串 3用字符指针处理字符串应用举例例例8.6将将字字符符串串s1从从第第m个个字字符符开开始始剩剩余余的的所所有有字字符符送送入到另一个字符串中。入到另一个字符串中。#include main()int m;char s180,s280,*p,*q;printf(input a string:n);gets(s1);printf(input start point:n);scanf(%d,&m);p=s1+m-1;q=s2;while(*p!=0)*q=*p;p+;q+;*q=0;puts(s2);8.3.4 指针与字符串 例例8.7利用字符指针数组输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 语言
限制150内