收藏 分享(赏)

程序设计(C语言)8.ppt

上传人:dreamzhangning 文档编号:3350964 上传时间:2018-10-17 格式:PPT 页数:66 大小:222.50KB
下载 相关 举报
程序设计(C语言)8.ppt_第1页
第1页 / 共66页
程序设计(C语言)8.ppt_第2页
第2页 / 共66页
程序设计(C语言)8.ppt_第3页
第3页 / 共66页
程序设计(C语言)8.ppt_第4页
第4页 / 共66页
程序设计(C语言)8.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

1、第8章 指针,1.存储单元:构成存储单元的基本单位是字节,不同类型的存储单元由数量不等的连续字节组成,计算机给每个字节一个惟一的编号。 2.指针:构成某一存储单元的连续字节的起始字节编号称为该存储单元的地址,也称为该存储单元对应变量的指针。即:变量的指针就是变量的地址,8.1.1 指针的概念,如果有:int a=5;则内存情况如图8-1所示。 a是存储单元(即变量)的名字,5是存放在存储单元中的内容, 存储单元的地址是2000。,图8-1,8.1.2 指针变量,指针变量:存放某一变量的地址的变量称为指针变量。 指针变量的一般定义形式如下: 类型标识符 *标识符; 例:int *p;允许指针变量

2、在定义中初始化。 例如:int a=5,*p= /*&a 是变量a的地址*/ 其示意图如图所示(图2):注意:此语句是将&a赋给p,而不是*p。,int a=5,*p=,图8-2,8.1.3 指针变量的运算,1赋值运算 不能直接给一个指针变量赋一个整数 变量的地址是通过对变量取地址运算得到的。&变量名 “&”是对变量取地址运算符,其作用是取得变量所占用的存储单元的地址(构成存储单元的连续字节的首字节编号)。,8.1.3 指针变量的运算,对指针变量的赋值是将另一变量的地址赋给指针变量。其一般格式有如下四种: 指针变量名=&变量名 指针变量名=指针变量名 指针变量名=指针变量名+整型数据值 指针变

3、量名=指针变量名-整型数据值,8.1.3 指针变量的运算,例如:int a,i=1;int *p,*q,*m,*n;p=,8.1.3 指针变量的运算,2取指针变量指向的存储单元(或变量)运算 *指针数据值 如果有: int a;int *p;p= 则:* p与a是相同的,表示同一个变量。,可以是常量、变量或表达式,8.1.3 指针变量的运算,“ 则:指针变量p指向变量a;*p(即a)的值赋给b,b的值为3;将5赋给*p(即a),a的值为5。,8.1.3 指针变量的运算,3比较运算 当两个基类型相同的指针变量已被正确赋值后,可以对指针变量的值进行比较运算。 如果有: int a6;int *p,

4、*q;p= 指针变量p、q的指向如图8-4所示。 此时,对p、q进行比较运算,则有: pq、p=q、p= =q的值为假; pq、p=q、p!=q的值为真。,图8-4,8.1.3 指针变量的运算,4减法运算 两个指针变量在一定条件下,可进行减法运算。 设p, q指向同一数组,则p-q的绝对值表示p所指对象与q所指对象之间的元素个数。,如果有:char a10=“Hello“;char *p,*q;int n;p= 指针变量p、q的指向 如图8-5所示,则:n=5。,图8-5,8.1.3 指针变量的运算,8.1.3 指针变量的运算,5指针变量的运算应用举例 例8.1 输入a和b两个整数,按先大后小

5、的顺序输出a和b。 #include main() int *p1,*p2,*p,a,b;scanf(“%d,%d“, ,8.2.1 指针与一维数组,一、一维数组与指针 定义一维数组与指针。 例:int a5,*p; 则a为首地址常量,其对象类型为int * ; a值与 则p0a2,p1a3,二、应用举例 例8.2 用不同的方法对有10个元素的整型数组进行输入输出。 方法一:下标法。p+ *p+,8.2.1 指针与一维数组,p+; /* 相当于p=p+1; */ 特殊表达式: *p+; 和 *p-; 先取用对象(*p),然后p自加减1+*p;与 *+p; 完全相同-*p;与*-p;完全相同 ,

6、这四种形式都是p先自加减1,然后再取用对象,等价于*(p+) 不等价于(*p)+,注意:,8.3.2 指针与二维数组,一、二维数组与指针 例 int b35; 可理解为:b是数组名.b是数组首地址.b数组包含三个元素:b0,b1,b2;而每个元素又是一个一维数组. 则:b &b0 表数组首地址.*b b0 &b00 代表数组首元素地址. *(b+i) bi &bi0 代表第i行0列元素的地址.,注:数组首地址值:b=*b=b0=&b0=&b00 第i行首地址 : b+i=*(b+i)=bi=&bi=&bi0,二维数组与一级指针变量 int b35,*p; 一般给p赋初值为数组首元素地址: p=

7、 则bij可用指针表示为:*(p+5*i+j) 或p5*i+j,列数,p+5,例8.3 用指向二维数组元素的指针变量处理二维数组的输入输出。 程序一: #include main() 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=0;i3;i+) for(j=0;j4;j+)printf(“%4d“,*(p+i*4+j);printf(“n“); ,8.3.2 指针与二维数组,程序二: #include main() int a34;int *p,i,j;for(p=a0;pa0+

8、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)指向一个由n个元素组成的一维数组的指针变量。 又称行指针变量,或数组指针。 其定义形式如下: 类型说明符 (*p)n; 说明: 1)类型说明符是指向一维数组元素的类型。 2)该语句定义了一个指针变量p。 3)指针变量p的基类型是由n个元素组成的一维数组类型。,行指针变量与二维数组,(二)二维数组与行指针 例:int b35;int (*p)5; 则:b是可以看作是一个二级指针常量; p是

9、可以看作是一个二级指针变量; 通常给p赋值为:p=b或p=b+i 则p每增1是移动到下一行。 则:bij的地址:*(b+i)+j =bi+j =pi+j =&pij=&bij=*(p+i)+j,列数,行指针变量与二维数组,例8.4 用指向一维数组的指针变量处理二维数组的输入输出。 程序一: #include main() int a34;int (*p)4,i,j;p=a;for(i=0;i3;i+)for(j=0;j4;j+)scanf(“%d“, (*(p+i)+j);for(i=0;i3;i+) for(j=0;j4;j+)printf(“%4d“,*(*(p+i)+j);printf(

10、“n“); ,程序二: #include main() 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 指针数组,数组元素为指针类型的数组称为指针数组。 指针数组的定义形式如下:类型说明符 *标识符常量表达式; 如果有:int *q3; 则指针数组q可以用图8-14所示,图8-14,说明: (1)类型说明符是数组元素存储的地址的基类型。 (2)

11、“*”表示数组的元素值是地址,即元素类型为指针类型。 (3)标识符是指针数组的名字。 (4)常量表达式表示指针数组的大小。,使用指针数组来处理二维数组。,例如:如果有: int a34; int *b3,i,j; for(i=0;i3;i+)bi=ai;则有如图8-15所示的存储关系。,图8-15,此时,二维数组a中任一元素aij的地址可用指针数组b表示如下: bi+j *(b+i)+j 相应地,二维数组a中任一元素aij可用指针数组b表示为: *( bi+j) bij *(*(b+i)+j) *(b+i)j,注意: (1)从以上用指针数组表示二维数组的形式看,其用法与用数组指针(指向一维数组

12、的指针)相似,但要注意两者的概念是不同的,指针数组是由多个元素组成的,即有多个变量,指针数组名是一个地址常量,而数组指针是指向一维数组的指针,是一个变量。 (2)指针数组和数组指针的定义形式是不同的:int *p3;定义p是一个指针数组;int (*p)3;定义p是一个数组指针。,指针数组与数组指针,用指针数组处理二维数组。,例8.5 用指针数组处理二维数组。 #include main() 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

13、(“%4d“, bij);printf(“n“); ,8.3.4 指针与字符串,一用字符指针表示字符串 字符指针的定义:char *字符指针变量名; 例1:#include main() char *str=“I am happy”; printf(“%s”,str); ,str,二、 字符数组与指针变量 1. 赋初值 static char str=”I love china!”;(静态或外部类) char *a=”I love china!”;(不必要求为静态或外部类) 2. 赋值 char *a; a=”I love china!”;(正确) char str14; str=”I lov

14、e china!”(错误) 3. 输入字符串 char str10; scanf(“%s”,str); 或gets(str);(正确) char *a; scanf(“%s”,a); (错误),8.3.4 指针与字符串,用指针输入字符串正确的做法应是: char str10; char *a;a=str; scanf(“%s”,a); gets(a); 或a=(char *)malloc(10);scanf(“%s”,a);,8.3.4 指针与字符串,输出字符串 char *s=”I am a student”;puts(s); 或printf(“%sn”,s); char str=”I am

15、 a student!”; puts(str); 或printf(“%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“, ,8.3.4 指针与字符串,例8.7 利用字符指针数组输出多个字符串。 #include main() char *s4;int i;

16、s0=“China“;s1=“Shanghai“;s2=“Beijin“;s3=“Wuhan“;for(i=0;i4;i+)printf(“%sn“,*(s+i); ,8.3.4 指针与字符串,8.4 指针与函数,8.4.1 指针作函数参数 函数的参数不仅可以是整型、实型、字符型等数据类型,还可以是指针类型。 指针作函数参数的作用是将一个变量的地址传送到另一个函数中。,例8.8 用指针作为函数参数处理:输入两个整数,按先大后小的顺序输出。 swap(int *p1,int *p2) int t;t=*p1;*p1=*p2;*p2=t; ,#include main() int a,b;scan

17、f(“%d %d“, ,通过本次函数调用,从被调用函数中带回了两个处理结果. 指针作形参,可以带回返回值,如果将swap(int *p1,int *p2)函数的定义改为以下两种形式,则函数调用形式以及结果会有什么不同?, swap(int p1,int p2) int t;t=p1; p1=p2; p2=t; ,swap(int *p1,int *p2) int *t;t=p1; p1=p2; p2=t; ,函数定义和函数调用的常用形式,形式一: main() int a10; fun(a,10); fun(int x ,int n) ,形式二: main() int a10; fun(a,1

18、0); fun(int *x,int n) ,形式三: main() int a10,*p; p=a; fun(p,10); fun(int x ,int n) ,形式四:main() int a10,*p;p=a fun(p,10); fun(int *x,int n) ,函数定义和函数调用的常用形式,例8.9 利用函数将数组a中的10个整数按相反顺序存放。 void inv (int x ,int n) int i,j,k,t;k=n/2;for(i=0;ik;i+) j=n-1-i;t=xj;xj=xi;xi=t; ,#include main() int a10,i;for(i=0;i

19、10;i+) scanf(“%d“, ,例8.10 利用函数将数组a中的10个整数从大到小进行排序。 void sort (int *a,int n) int i,j,k,t;for(i=0;iak)k=j; t=ak;ak=ai;ai=t; ,#include main() int a10,*p,i;for(i=0;i10;i+) scanf(“%d“, ,8.4.2 指针函数,一个函数可以带回整型值、实型值、字符型值,也可以带回指针类型的数据,即地址。返回值是指针类型的函数,称为指针函数。 指针函数的定义:类型标识符 *标识符(参数表);,8.4.2 指针函数,例如:char *copy(

20、char *s) char *s1;s1=s;return(s1); #include main() char a 80,*b;scanf(“%s“,a);b=copy(a);printf(“%s“,b); ,8.4.3 函数指针,1函数的地址 函数在编译时被分配占用一段连续的存储单元,该连续的存储单元的首地址称为函数的地址。在C语言程序中,用函数的名字表示该函数的地址。 例:如果有如下函数定义: int sum(int x,int y) int z; z=x+y; return(z); 则函数名sum表示该函数的地址。,2指向函数的指针变量(函数指针) 将函数的首地址存入一个指针变量中,该指

21、针变量就被称为指向函数的指针变量,又称为函数指针。 函数指针的定义: 类型标识符 (*标识符)(); 例如:int (*p)(); 说明: (1)“类型标识符”是函数指针指向的函数返回值的类型。 (2)“标识符”是函数指针(指向函数的指针变量)的名字。 (3)“(*标识符)”表示该标识符是一个指针变量。 (4)标识符后的“()”表示该指针变量指向一个函数。,8.4.3 函数指针,函数指针的赋值(将函数指针指向某一函数): 函数指针名=函数名; 例如:p=sum; 利用函数指针调用其指向的函数: (*函数指针名)(),8.4.3 函数指针,例如:#include main() int a,b,c

22、; int sum(int,int); int (*p)(); p=sum; scanf(“%d%d“, ,8.5 指向指针的指针,8.5 指向指针的指针 存放另一指针变量的地址的指针变量,称为指向指针的指针。 指向指针的指针变量的定义: 类型标识符 *标识符; 例如:如果有: int *p,*q,x; q= 则有如图8-18所示的指针指向。,8.5 指向指针的指针,如果将二维数组的每一行的地址存储在一个指针数组中,再将指针数组的首地址赋给一个指向指针的指针变量,则也可以使用指向指针的指针变量来处理二维数组。 例如,如果有: int a34; int *b3,i,j; int *p; for(

23、i=0;i3;i+)bi=ai; p=b; 则有如图8-19所示的存储关系。,图8-19,则:p在使用时相当于b.,例8.11 利用指向指针的指针处理二维数组。 #include main() int a34=1,3,5,7,9,11,2,4,6,8,10,12;int *b3 ,i,j;int *p;for(i=0;i3;i+)bi=ai;p=b;for(i=0;i3;i+) for(j=0;j4;j+)printf(“%4d“,*(*(p+i)+j);printf(“n“); ,8.5 指向指针的指针,8.5 指向指针的指针,例8.12 利用指向指针的指针输出多个字符串. #include

24、 main() char *s4,*p;int i;s0=“China“;s1=“Shanghai“;s2=“Beijing“;s3=“Wuhan“;p=s;for(i=0;i4;i+)printf(“%sn“,pi); ,8.6 命令行参数,例8.13 编写一个程序,显示命令行上的所有参数。 #include main(int argc,char *argv ) while(argc1) +argv;printf(“%sn”,*argv);-argc; 将上述程序以文件名echo.c存盘,经过编译、连接后,在命令行上输入命令及屏幕显示结果如下:,C:echo China Beijin Sha

25、nghai China Beijin Shanghai,argv0,argv1,argv2,argc=3,8.6 命令行参数,带参数的main()的函数首部形式如下: main(int argc,char *argv ) 说明: (1)第一个形参argc是int类型,保存命令行中字符串的个数。 (2)第二个形参argv是指向字符的指针数组,保存命令行中给出的字符串。 调用带参数的main()函数的命令行形式如下: 命令名 参数1 参数2 参数n 注意:命令名、各参数之间用空格隔开。 字符串的个数(包括命令名字符串和所有参数字符串,即参数个数n+1)传递给main函数中的第一个参数argc, 将

26、命令行中的字符串(同样包括命令名字符串和所有参数字符串)传递给main函数中的第二个参数argv。,8.7 本章考点,指针与指针变量的概念。 指针变量的运算。 一维数组的地址、指向一维数组的指针及其应用。 二维数组的地址、指向二维数组的指针及其应用。 指针数组的概念及其应用。 用指针表示字符串。 指针变量作为函数参数。 指向指针的指针变量及其应用。 命令行参数的基本概念。,8.7 本章考点,8.8 典型试题详解 1对于基类型相同的两个指针变量,不能进行的运算是_。 A) B)= C)+ D)- 正确答案:C(知识点:指针变量的运算) 试题分析:基类型相同的两个指针变量可以进行比较、赋值及相减运

27、算。2若有说明int n=2,*p=,则以下非法的赋值语句为_。 A)p=q B)*p=*q C)n=*q D)p=n 正确答案:D(知识点:指针与指针变量的概念、指针变量的运算) 试题分析:赋值运算必须遵循类型相同或类型兼容原则。,8.7 本章考点,3以下程序的输出结果是_。 main() char p=abcdefgh,r;long *q;q=(long*)p;q+;r=(char*)q;printf(%sn,r); 正确答案:efgh(知识点:指针变量的概念、用指针处理字符串),8.7 本章考点,4设有以下程序: main() int a,b,k=4,m=6,*p1= 执行该程序后,a的

28、值为_,b的值为_。 正确答案:0 7(知识点:指针与指针变量的概念、指针变量的运算) 试题分析:a的值是两个指针值p1与&m进行比较运算=的结果,p1的值为&k,不等于&m,a的值为0;b的值为(*p1)/(*p2)+7,即k/m+7,为7。,8.7 本章考点,5若有以下定义和语句 double r=99,*p=”把变量r的值放回r 中 正确答案:D(知识点:指针与指针变量的概念),8.7 本章考点,6有以下程序: main() int a33,*p,i;p= 程序运行后的输出结果是_。 正确答案:6(知识点:二维数组元素的地址、指向二维数组元素的指针变量,7下列程序的输出结果是_。 mai

29、n() char a10=9,8,7,6,5,4,3,2,1,0,*p=a+5;printf(“%dn“,*-p); 正确答案:5(知识点:一维数组的地址、指向一维数组的指针变量),8.7 本章考点,8有以下程序: main() int a3=1,2,3,4,5,0,(*pa)3,i;pa=a;for(i=0;i3;i+)if(i2) pa1i=pa1i-1;else pa1i=1;printf(%dn,a01+a11+a12); 执行后输出结果是_。 正确答案:7(知识点:二维数组的地址、指向二维数组的指针变量、数组指针) 试题分析:程序中定义了一个数组指针pa指向二维数组a,paij即为a

30、ij。,8.7 本章考点,9以下程序通过函数指针p调用函数fun,请在填空栏内写出定义变量p的语句。 void fun(int *x, int *y) main() int a=10,b=20;_;p=fun;p(,8.7 本章考点,10有以下程序段: main() int a=5,*b,*c;c=语句后,表达式*c的值是_。 正确答案:变量a的值(知识点:指向指针的指针) 试题分析:程序中定义了指向指针的指针变量c来指向指针变量b,指针变量b再指向整型变量a,*c是取其指向存储单元所指向的存储单元的值,即变量a的值。,8.7 本章考点,11假定下列程序的可执行文件名为prg.exe, 则在该

31、程序所在的子目录下输入命令行:prg hello good后,程序的输出结果是_。 main(int argc,char *argv) int i;if(argc=0) return ;for(i=1;iargc;i+)printf(%c,*argvi); 正确答案:hg(知识点:命令行参数、指针数组),8.7 本章考点,12不合法的main函数命令行参数形式是_。 A)main(int a ,char *c ) B)main(int arc ,char *arc) C)main(int argc ,char *argv) D)main(int argv ,char *argc ) 正确答案:C(知识点:命令行参数),8.7 本章考点,

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报