关闭

关闭

关闭

封号提示

内容

首页 第11章 指针.ppt

第11章 指针.ppt

第11章 指针.ppt

上传者: 军刀 2013-08-09 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《第11章 指针ppt》,可适用于人文社科领域,主题内容包含指针解析指针解析wwwmingribookcom内容教学目的内容教学要求重点难点教学内容教学目的教学目的通过本章的学习使读者对指针有一定的了解并能够符等。

指针解析指针解析wwwmingribookcom内容教学目的内容教学要求重点难点教学内容教学目的教学目的通过本章的学习使读者对指针有一定的了解并能够使用指针进行编程。教学要求教学要求掌握指针的相关概念掌握指针与数组之间的关系掌握指向指针的指针掌握如何使用指针变量做函数参数了解main函数的参数。重点难点重点难点重点:地址与指针的关系指针自加自减运算数组与指针的关系函数参数的指针变量难点:指向指针的指针指针数组作main函数的参数。教学内容教学内容函数参数的指针变量概述指针数组与指针指向指针的指针返回指针值的函数指针函数作main函数的参数。概述指针概述指针指针是C语言显著的优点之一指针使用起来十分灵活而且能提高某些程序的效率但是指针使用不当很容易就造成系统错误往往许多程序“挂死”的大部分原因都是由于错误地使用指针所造成的。地址与指针系统的内存就像是带有编号的小房间如果想使用内存就需要得到房间编号。如图所示定义一个整型变量i整型变量需要个字节所以编译器为变量i分配编号从到如图所示。地址就是内存区中对每个字节的编号那么指针又是什么呢?这里仅将指针看作是内存中的一个地址多数情况下这个地址是内存中另一个变量的位置。如图所示。概述指针概述指针解读变量与指针变量的地址是变量和指针这两者之间连接的纽带如果一个变量包含了另一个变量的地址那么第个变量可以说成是指向第个变量。所谓“指向”就是通过地址来体现的在程序中用“*”符号表示“指向”。因为指针变量是指向一个变量的地址所以将一个变量的地址值赋给这个指针变量后这个指针变量就“指向”了该变量。例如将变量i的地址存放到指针变量p中p就指向i。其关系如图所示。在程序代码中是通过变量名来对内存单元进行存取操作但是代码经过编辑后已经将变量名转换为该变量在内存的存放地址对变量值的存取都是通过地址进行的。例如对上图中所示的变量i和变量j进行如下操作。ij其含义根据变量名与地址的对应关系找到变量i的地址然后从开始读取四个字节数据放到CPU寄存器中再找到变量j的地址从开始读取四个字节的数据放到CPU另一个寄存器中通过CPU计算出结果。在低级语言的汇编语言中都是直接通过地址来访问内存单元而在高级语言中才使用变量名访问内存单元但C语言作为高级语言却提供了通过地址来访问内存单元的方法。概述指针概述指针使用指针变量.指针变量的一般形式如果有一个变量专门用来存放另一变量的地址则它称为“指针变量”。如果一个变量包含有指针(指针等同于一个变量的地址)则必须对它作说明。定义指针变量的一般形式如下。类型说明*变量名其中*表示这是一个指针变量变量名即为定义的指针变量名类型说明表示本指针变量所指向的变量的数据类型。.指针变量的赋值指针变量同普通变量一样使用之前不仅要定义而且必须赋予具体的值。未经赋值的指针变量不能使用。给指针变量所赋的值与给其它变量所赋的值不同给指针变量的赋值只能赋予地址而不能赋予任何其它数据否则将引起错误。C语言中提供了地址运算符“”来表示变量的地址。其一般形式为。变量名如a表示变量a的地址b表示变量b的地址。给一个指针变量赋值可以有以下两种方法。定义指针变量的同时就进行赋值。intaint*p=a先定义指针变量之后再赋值。intaint*pp=a实例从键盘中输入两个数分别代表苹果和香蕉的价格利用指针的方法将这两个数输出。概述指针概述指针.指针变量的引用引用指针变量是对变量进行间接访问的一种形式。对指针变量的引用形式如下。*指针变量其含义是引用指针变量所指向的值。实例利用指针变量实现数据输入、输出。.“”和“*”运算符在前面介绍指针变量的过程中用到了两个运算符分别是“”和“*”运算符“”是一个返回操作数地址的单目运算符叫做取地址运算符例如p=i就是将变量i的内存地址赋给p这个地址是该变量在计算机内部的存储位置。运算符“*”是单目运算符叫做指针运算符作用是返回指定的地址内的变量的值例如前面提到过p中装有变量i的内存地址则q=*p就是将变量i的值赋给q假如变量i的值是则q的值也是。.“*”和“*”区别如果有如下语句。intap=a那么通过以上两条语句来分析下“*”和“*”之间的区别和*的运算符优先级别相同按自右而左的方向结合。因此*p先进行*运算*p相当于变量a再进行运算*p就相当于取变量a的地址。*a先计算预算符a就是取变量a的地址然后计算*运算*a就相当于取变量a所在地址的值实际就是变量a。下面通过两个例子具体看下。实例“*”应用。实例“*”应用概述指针概述指针指针自加自减运算指针的自加自减运算不同于普通变量的自加自减运算也就是说它并不是简单的加减这里就通过两个例题具体分析。实例整型变量地址输出。实例整型变量地址输出。数组与指针数组与指针系统需要提供一定量连续的内存来存储数组中的各元素内存都有地址指针变量就是存放地址的变量如果把数组的地址赋给指针变量就可以通过指针变量来引用数组。下面就将介绍下如何用指针来引用一维数组及二维数组元素。一维数组与指针当定义一个一维数组系统会在内存中为该数组分配一个存储空间其数组的名字就是数组在内存的首地址。若再定义一个指针变量并将数组的首地址传给指针变量则该指针就指向了这个一维数组。例如:int*p,ap=a这里a是数组名也就是数组的首地址将它赋给指针变量p也就是将数组a的首地址赋给p也可以写成如下形式。int*p,ap=a上面这个语句是将数组a中的首个元素的地址赋给指针变量p。由于a的地址就是数组的首地址所以两条赋值操作效果完全相同如实例。实例输出数组中的元素。根据上面语句将通过以下几方面进行介绍。pn与an表示数组元素an的地址即an。对整个a数组来说共有个元素n的取值为~则数组元素的地址就可以表示为p~p或a~a。如何来表示数组中的元素用到了前面介绍的数组元素的地址表示用*(pn)和*(an)来表示数组中的各元素。表示指针的移动可以使用“”和“”这两个运算符。数组与指针数组与指针二维数组与指针定义一个行列的二维数组其在内存中的存储形式如图所示。从上图中可以看到几种表示二维数组中元素地址的方法下面逐一进行介绍。()a既可以看作数组行列的首地址同样还可以看作是二维数组的首地址。amn就是第m行n列元素的地址。()an表示第行第n个元素地址。实例利用指针对二维数组进行输入输出。()a是第行的首地址当然an就是第n行的首地址。实例将一个行列的二维组的第行元素输出。()an表示第n行的首地址。前面讲过了如何利用指针来引用一维数组这里在一维数组的基础上来介绍一下如何通过指针来引用一个二维数组中的元素。*(*(an)m)表示第n行第m列元素。*(anm)表示第n行第m列元素。数组与指针数组与指针字符串与指针访问一个字符串可以通过两种方式第一种方式就是前面讲过的使用字符数组来存放一个字符串从而实现对字符串的操作另一种方法就是下面将要介绍到的使用字符指针指向一个字符串此时可不定义数组。实例字符型指针应用。实例声明两个字符数组将str中的字符串复制到str中。数组与指针数组与指针字符串数组字符串数组是以字符串作为数组元素的数组可以将其看成一个二维字符数组下面定义一个简单的字符串数组。charcountry={"China","Japan","Russia","Germany","Switzerland"}字符型数组变量country被定义为含有个字符串的数组每个字符串的长度要小于(这里要考虑字符串最后的‘’)。通过观察上面定义的字符串数组会发现像“China”和“Japan”这样的字符串其长度仅为加上字符串结束符也仅为而内存中却要给它们分别分配一个字节的空间这样就会造成资源浪费。为了解决这个问题可以使用指针数组每个指针指向所需要的字符常量这种方法虽然需要在数组中保存字符指针同样也占用空间但要远少于字符串数组需要的空间。那么什么是指针数组?一个数组其元素均为指针类型数据称为指针数组也就是说指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式如下。类型名数组名数组长度实例输出月。指向指针的指针指向指针的指针一个指针变量可以指向整型变量、实型变量、字符类型变量当然也可以指向指针类型变量。当这种指针变量用于指向指针类型变量时则称之为指向指针的指针变量。这种双重指针如图所示整型变量i地址是i其值传递给指针变量p则p指向i同时将p的地址p传递给p则p指向p。这里的p就是前面讲到的指向指针变量的指针变量即指针的指针。指向指针的指针变量定义如下。类型标识符**指针变量名例如:int**p其含义为定义一个指针变量p它指向另一个指针变量,该指针变量又指向一个基本整型变量。由于指针运算符“*”是自右至左结合所以上述定义相当于:int*(*p)既然知道了如何定义指向指针的指针那么可以将上面图更形象的表示出来。下面看一下指向指针变量的指针变量在程序中是如何应用的。实例使用指向指针的指针输出月。实例利用指向指针的指针输出一维数组中是偶数的元素并统计偶数的个数。函数参数的指针变量函数参数的指针变量通过前面的学习知道整型变量、实型变量、字符型变量、数组名和数组元素等均可作为函数参数。此外指针型变量也可以作为函数参数这节会具体介绍下。首先通过下面的实例来看下如何用指针变量来做函数参数的。实例调用自定义函数交换两变量值。在函数调用过程中主调用函数与被调用函数之间有一个数值传递过程。函数调用中发生的数据传递是单向的只能把实参的值传递给形参在函数调用过程中形参的值发生改变实参的值不会发生变化所以上面的这段代码同样不能实现x和y值的互换。通过指针传递参数可以减少值传递带来的开销也可以使函数调用不产生值传递。下面来看下嵌套的函数调用是如何来使用指针变量做函数参数的。实例嵌套的函数调用。C语言中实参变量和形参变量之间的数据传递是单项的“值传递”方式。指针变量作函数参数也是如此调用函数不可能改变实参指针变量的值但可以改变实参指针变量所指变量的值。函数参数的指针变量函数参数的指针变量前面两个例子都是用一个指向数组的指针变量作函数参数在前面介绍过指向指针的指针这里就来通过一个例子看下如何用指向指针的指针作函数参数。实例编程实现对英文的月份按字母顺序进行排序。下面将通过一个二维数组使用指针变量作函数参数的例子来加深读者对该部分知识的理解。实例找出数组每行中最大的数并将这三个数相加求和。前面介绍过了指向数组的指针变量的定义和使用这里介绍下如何指向数组的指针变量做函数参数。形式参数和实际参数均为指针变量。实例任意输入个数据先将这个数据中是奇数的数据输出再求这个数据中所有奇数之和。数组名就是这个数组的首地址所以也可以将数组名作为实参传递给形式参数。例如:order(a,n)*调用order函数*就是直接使用数组名做函数参数的。实例使用指针实现冒泡排序当形参为数组时实参也可以为指针变量。可将上例改写成如下形式。返回指针值的函数返回指针值的函数指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数然后通过该指针变量调用此函数。一个函数可以带回一个整型值、字符值、实型值等也可以带回指针型的数据即地址。其概念与以前类似只是带回的值的类型是指针类型而已。返回指针值的函数简称为指针函数。定义指针函数的一般形式为。类型名*函数名(参数表列)例如:int*fun(intx,inty)fun是函数名调用它以后能得到一个指向整型数据的指针。x和y是函数fun的形式参数这两个参数也均为基本整型。这个函数的函数名前面有一个*表示此函数是指针型函数类型说明是int表示返回的指针指向整型变量。实例求长方形的周长指针数组作main函数的参数指针数组作main函数的参数main函数的第一行一般形式如下。main()从上面会发现main函数是没有参数的那么到底main函数能否有参数呢?实际上main函数可以是无参函数也可以是有参的函数。对于有参的形式来说就需要向其传递参数。下面先看一下main()函数的带参的形式。main(intargc,char*argv)从函数参数的形式上看包含一个整型和一个指针数组。当一个C的源程序经过编译、链接后会生成扩展名为exe的可执行文件这是可以在操作系统下直接运行的文件对于main函数来说其实际参数和命令是一起给出的也就是在一个命令行中包括命令名和需要传给main函数的参数。命令行的一般形式为。命令名参数参数参数n。例如:d:debughellohiyeah命令行中的命令就是可执行文件的文件名如语句中的d:debug命令名和其后所跟参数之间需用空格分隔。命令行与main()函数的参数存在如下的关系。设命令行为:filehappybrightglad其中file为文件名也就是一个由filec经编译、链接后生成的可执行文件fileexe其后各跟个参数。以上命令行与main函数中的形式参数关系如下。指针数组作main函数的参数指针数组作main函数的参数它的参数argc记录了命令行中命令与参数的个数(file、happy、bright、glad)共个指针数组的大小由参数的值决定即为char*argv该指针数组的取值情况如图所示。利用指针数组作main函数的形参可以向程序传送命令行参数。参数字符串的长度是不定的并且参数字符串的长度不需要统一且参数的数目也是任意的并不规定具体个数。下面通过实例具体看下带参的main函数如何使用。实例输出main函数参数内容。ThankyouThankyouwwwmingribookcom

职业精品

用户评论

0/200
    暂无评论

精彩专题

上传我的资料

热门资料

资料评价:

/22
0下载券 下载 加入VIP, 送下载券

意见
反馈

返回
顶部