第八章 指针.ppt

大学二级C语言程序设计及同步训练-涂玉芬-课件PPT

收藏

资源目录
跳过导航链接。
大学二级C语言程序设计及同步训练-涂玉芬-课件PPT.zip
二级C语言程序设计及同步训练-涂玉芬-PPT演示文稿
教案资料.ppt---(点击预览)
二级C语言程序设计及同步训练-涂玉芬-PPT课件文件
文稿ppt_ppt.txt---(点击预览)
文稿ppt_ppt.jpg---(点击预览)
文稿ppt.ppt---(点击预览)
二级C语言程序设计及同步训练-涂玉芬-大学教学资料
压缩包内文档预览:(预览前20页/共66页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:21836173    类型:共享资源    大小:11.93MB    格式:ZIP    上传时间:2019-09-06 上传人:QQ24****1780 IP属地:浙江
25
积分
关 键 词:
大学 二级 语言程序设计 同步 训练 涂玉芬 课件 ppt
资源描述:
大学二级C语言程序设计及同步训练-涂玉芬-课件PPT,大学,二级,语言程序设计,同步,训练,涂玉芬,课件,ppt
内容简介:
第8章 指针,1.存储单元:构成存储单元的基本单位是字节,不同类型的存储单元由数量不等的连续字节组成,计算机给每个字节一个惟一的编号。 2.指针:构成某一存储单元的连续字节的起始字节编号称为该存储单元的地址,也称为该存储单元对应变量的指针。即:变量的指针就是变量的地址,8.1.1 指针的概念,如果有:int a=5;则内存情况如图8-1所示。 a是存储单元(即变量)的名字, 5是存放在存储单元中的内容, 存储单元的地址是2000。,图8-1,8.1.2 指针变量,指针变量:存放某一变量的地址的变量称为指针变量。 指针变量的一般定义形式如下: 类型标识符 *标识符; 例:int *p; 允许指针变量在定义中初始化。 例如:int a=5,*p= /*&a 是变量a的地址*/ 其示意图如图所示(图2): 注意:此语句是将&a赋给p,而不是*p。,int a=5,*p=,图8-2,8.1.3 指针变量的运算,1赋值运算 不能直接给一个指针变量赋一个整数 变量的地址是通过对变量取地址运算得到的。 &变量名 “&”是对变量取地址运算符,其作用是取得变量所占用的存储单元的地址(构成存储单元的连续字节的首字节编号)。,8.1.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,*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两个整数,按先大后小的顺序输出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;完全相同 , 这四种形式都是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= 则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+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是可以看作是一个二级指针变量; 通常给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(“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)“*”表示数组的元素值是地址,即元素类型为指针类型。 (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)从以上用指针数组表示二维数组的形式看,其用法与用数组指针(指向一维数组的指针)相似,但要注意两者的概念是不同的,指针数组是由多个元素组成的,即有多个变量,指针数组名是一个地址常量,而数组指针是指向一维数组的指针,是一个变量。 (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(“%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 love 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 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; 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; scanf(“%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,10); 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;i10;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(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指向函数的指针变量(函数指针) 将函数的首地址存入一个指针变量中,该指针变量就被称为指向函数的指针变量,又称为函数指针。 函数指针的定义: 类型标识符 (*标识符)(); 例如:int (*p)(); 说明: (1)“类型标识符”是函数指针指向的函数返回值的类型。 (2)“标识符”是函数指针(指向函数的指针变量)的名字。 (3)“(*标识符)”表示该标识符是一个指针变量。 (4)标识符后的“()”表示该指针变量指向一个函数。,8.4.3 函数指针,函数指针的赋值(将函数指针指向某一函数): 函数指针名=函数名; 例如:p=sum; 利用函数指针调用其指向的函数: (*函数指针名)(),8.4.3 函数指针,例如:#include main() int a,b,c; 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(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 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 Shanghai 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, 将命令行中的字符串(同样包括命令名字符串和所有参数字符串)传递给main函数中的第二个参数argv。,8.7 本章考点,指针与指针变量的概念。 指针变量的运算。 一维数组的地址、指向一维数组的指针及其应用。 二维数组的地址、指向二维数组的指针及其应用。 指针数组的概念及其应用。 用指针表示字符串。 指针变量作为函数参数。 指向指针的指针变量及其应用。 命令行参数的基本概念。,8.7 本章考点,8.8 典型试题详解 1对于基类型相同的两个指针变量,不能进行的运算是_。 A) B)= C)+ D)- 正确答案:C(知识点:指针变量的运算) 试题分析:基类型相同的两个指针变量可以进行比较、赋值及相减运算。 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的值为_,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下列程序的
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:大学二级C语言程序设计及同步训练-涂玉芬-课件PPT
链接地址:https://www.renrendoc.com/p-21836173.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!