指针百度文库_第1页
指针百度文库_第2页
指针百度文库_第3页
指针百度文库_第4页
指针百度文库_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、指针一、 指针的定义计算机的内存都以字节为单位进行了编号,这个编号值就称为内存单元的地址值,简称内存地址。设某变量的值是地址值,这种变量称为指针变量,简称为指针。指针的定义形式为:存储类型 数据类型 *变量名;或者,存储类型 数据类型* 变量名; 。说明:1 存储类型是指针本身的存储类型,分别是auto、register、static和extern四种,缺省为auto。2 数据类型是指针所指向的数据的数据类型。但是,在使用指针时经常认为指针的类型是“指向某类型”或说“某类型*”,并对应存储相应类型的数据的地址。例如long*类型的指针存储long类型数据的地址。3 “*”是指针的标识,并不是变

2、量名中的字符。“*”放在变量名前或者紧跟在数据类型后都可以,但是要切记指针的类型是“某类型*”型。一个“*”只能定义一个指针。4 一般地,内存地址是十六进制整数的值。将地址值赋给一个指针称为该指针指向该地址(如果是变量或常量的地址,就可以说指针指向该变量或常量)。指针就能赋予地址值,如果赋予整型值会被当成地址,其它类型可能会产生错误。二、 指针的使用“*”和“&”运算符“&”运算符“&”称为取地址运算符,它的作用是求取变量的内存地址,使用形式为:&变量 。说明:1 使用“&”运算符可以求得任何类型的变量的地址,但必须用对应类型的指针来存储。2 指针不存在兼容存储,即char、int、float

3、和double等几种数值类型的指针不可混用,变量的类型必须和指针类型一致。3 “变量”可以是任何类型的变量,包括指针。如果是指针,就求得指针的地址。4 取地址运算符“&”和位运算符“&”虽然符号一样,但编译器会根据位置区别它们。“*”运算符“*”称为指针运算符,它的作用是求取指针所指向内存地址中的值,使用形式为:*指针变量说明:1 指针运算符“*”只能作用于地址量(指针或数组名),不能作用于其它类型的变量。2 乘法运算符“*”、指针标识“*”和指针运算符“*”虽然符号都一样,但编译器会根据它的位置区别它们。三、指针的初始化指针在使用之前必须初始化,使用未初始化的指针时很危险的。指针初始化的方式

4、为:数据类型* 指针=&变量; 。如果不让指针指向某个确定的变量,可以把它初始化为空指针,形如:数据类型* 指针=0; 。说明:符号“NULL”在标准库中定义为9,在C中常常用于初始化空指针,但是在C+中最好使用0来初始化空指针。四、指针和数组对任意的一个数组array(省略类型和长度),设一个同类型的指针pa,若将数组的首地址赋给指针,pa=array,则称指针pa是指向数组array的指针,数组array是指针pa指向的数组。指针不仅可以指向整个数组,还可以指向每个元素。指针指向元素的方式为:pa=&arrayi(将第i个元素的首地址赋给指针pa)。使用pa=&arrayi,表示指针pa指

5、向数组的第i个元素;又由于数组名表示数组的首地址(起始地址),故pa=&array0和pa=array等效,即指针指向数组同时也指向数组的第0个元素。由以上得出三种引用数组元素的方式:1 下标方式,例如:arrayi;2 数组名方式,例如:*(array+i;3 指针变量方式,例如:*(pa+i。一维数组与变量的关系很简单也很直观,但是二维及多维数组略微复杂。对任意的二维数组array(省略类型和长度),数组名array代表了整个数组的首地址,同时也是第0行的首地址,也是第0行第0列元素的首地址,所以有以下等式成立:array=array0=&array00 。在这里我引入“行指针”和“列指针

6、”的概念。当然很多书上没有这么说,但是我认为引入之后可以把这点内容讲得更清楚(我在大学时教材就有这两个概念)。下图表示一个二维数组的逻辑分布:上图所示(为了方便作图,数组名array用一个字母a表示),“二维数组名+i”表示第i行的首地址,例如:array+i是第i行的首地址,i0。注意:1 数组名表示的是行指针,即array是行指针,array+i表示的是数组array第i行的首地址,移动方式是逐行移动;而arrayi是列指针,arrayi+j表示的是第i行第j列的元素的地址,它的移动方式只能是在同一行的元素上移动。这里规定:在行指针前用“*”运算符,将使行指针指向列;在列指针前用“&”运算

7、符,将使列指针指向行。因此,arrayi=*(array+i。因此如下等式成立:arrayi+j=*(array+i+j=&arrayij,这些指针都指向同一内存地址。因此又有这些等式:*(arrayi+j=*(*(array+i+j=arrayij。2 array+i和arrayi的值是相同的,但它们的移动方式不同,array+i是行指针,一行一行地移动,arrayi是列指针,一列一列地移动。如上图示。3 &arrayi和arrayi的值也相同,但它们的移动方式也不同,&arrayi是行指针,arrayi是列指针,所以&arrayi+1和arrayi+1的含义不一样前者指向下一行,后者指向下

8、一列。可能上面这段话说得很绕。如果觉得看起很麻烦可以直接看图示中红色箭头的方向,应该能明白行指针和列指针移动方式的区别。更高维的数组就按照相应的方法分解为二维和一维数组来分析。char*类型的指针和指针数组就不详述了,其它书上说得太多了。char*类型的指针可以表示一个字符串;指针数组就是数组元素是指针的数组,声明方式为:数据类型* 数组名;五、常量指针和指向常量的指针举个例子来说明。设三个指针的声明分别是char* pstars;const char* pstars;char* const pstars;const char* const pstars;分析下这四个声明有什么不同。号声明是个

9、很普通的指针声明,指针pstars指向一个char类型的数据的地址,这个数据可以是变量或常量。号声明中,指针pstars指向一个常量的质地。号声明中,指针pstars本身是个地址常量,但是它指向的数据可以是变量或常量。号声明中,指针pstars本身是常量,同时它也指向一个常量。因此我们得出常量指针和指向常量的指针的定义。形如所示的这种指针称为指向常量的指针;形如所示的这种指针称为常量指针;形如的这种指针是一个指向常量的常量指针。六、多级指针如果一个指针指向另一个指针,呢么称这个指针为指向指针的指针,又称为二级指针。二级指针的定义形式为:数据类型* 指针名; 。由二级指针可以引申出更高级指针的定

10、义,如三级指针:数据类型* 指针名; 。说明:1 如果把二级分解下,可以写成这种形式(数据类型* 指针名; 。也就是说,二级指针存放的是一个类型为“数据类型*”的指针的地址,比如int* pa,就可以看成是(int* pa,那么指针pa存放的就是一个类型是int*的指针的地址。三级指针就看成(“数据类型* 指针名”,进而再分解称二级指针。2 用多级指针调用变量称为多级访问。例如,设int* pp; ,pp为一个二级指针,它指向另一个int*指针。如果赋值完毕后,调用变量就要使用“*pp”的形式。相应的,是几级指针就要用几个“*”号。七命令行参数主函数main(是可以带有参数的。由于任何函数都不

11、能调用主函数main(,因此主函数main(的参数只能由操作系统赋予。主函数的参数有两个:一个整型参数用于记录从命令行上输入的实参的个数,用argc表示;另一个参数是一个字符指针数组argv,它用来存储从命令行上输入的实参字符串的首地址,换言之,它的每个元素指向一个从命令行上传递而来的字符串。因此,主函数main(的完整形式为:返回值类型 main(int argc,char* argv说明:1 命令行是指操作系统的命令输入接口。在windows下,可以通过command窗口或者运行菜单进入命令行。2 argv虽然是个数组名,但是在这里允许作为一个指针变量使用,即argv可像指针变量那样作自增、自减以及加减一个整数等运算。3 在命令行上,各个实参之间的分隔符一般用空格。4 主函数main(的返回值类型可以是其它类型,这个返回值由操作系统获得。备注:本人水平有限,加之在精力同样有限的情况下,难免会有很多考虑不足之处,对指针这章说得比较简约,像很多内容,比如指针的算术运算、指针数组、多级指针等概念都没怎么说。这些东西在很多资料书上都有,读者可以自行在网上查阅,再说也比

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论