资源描述:
《C语言程序设计 教学课件 作者 王玉 主编第8章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第8章指针本章主要内容8.1指针的基本概念8.2变量的指针和指向变量的指针变量8.3数组的指针和指向数组的指针变量8.4指向多维数组的指针和指针变量8.5字符串的指针和指向字符串的指针变量8.6函数指针变量8.7指针型函数8.8指针数组和指向指针的指针8.9指针数据类型和指针运算8.1指针的基本概念一般把存储器中的一个字节称为一个内存单元。为了正确地访问这些内存单元,必须为每个内存单元编上号。内存单元的编号也叫做内存的地址。通常也把这个地址称为指针。一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。为了避免混淆,我们约定“指针”是指地址,是常
2、量;“指针变量”是指取值为地址的变量。8.2变量的指针和指向变量的指针变量8.2.1指针变量的定义8.2.2指针变量的引用8.2.3指针变量作为函数参数8.2.1指针变量的定义对指针变量的定义包括三个内容:①指针类型说明,即定义变量为一个指针变量。②指针变量名。③变量值(指针)所指向的变量的数据类型。其一般形式为:类型说明符*变量名;其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。8.2.2指针变量的引用指针变量使用之前不仅要定义说明,而且必须赋予具体的值。指针变量的赋值只能赋予地址,决不能赋予任
3、何其它数据。在C语言中,变量的地址是由编译系统分配的,用户不知道变量的具体地址。两个有关的运算符:①&:取地址运算符。②*:指针运算符(或称“间接访问”运算符)。C语言中提供了地址运算符&来表示变量的地址。其一般形式为:&变量名;变量本身必须预先说明。8.2.3指针变量作为函数参数函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。注意:不能通过改变指针形参的值而使指针实参的值改变。8.3数组的指针和指向数组的指针变量8.3.1指向数组元素的指针8.3.2通过指针引用数组元素8.3.3数组名和数组
4、指针变量作函数参数8.3.1指向数组元素的指针所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。定义一个指向数组元素的指针变量的方法,与以前介绍的指针变量相同。数组指针变量的一般形式为:类型说明符*指针变量名;其中类型说明符表示所指数组的类型。8.3.2通过指针引用数组元素C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。引用一个数组元素可以用:①下标法,即用a[i]形式访问数组元素。②指针法,即采用*(a+i)或*(p+i)形式,用间接访问的
5、方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其值p=a。几个注意的问题:①指针变量可以实现本身的值的改变。②要注意指针变量的当前值。③指针变量可以指到数组以后的内存单元,系统并不认为非法。④*p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。⑤*(p++)与*(++p)作用不同。⑥(*p)++表示p所指向的元素值加1。⑦如果p当前指向a数组中的第i个元素,则:*(p--)相当于a[i--];*(++p)相当于a[++i];*(--p)相当于a[--i]。8.3.3数组名和数组指针变量作函数参数1.数组名可以作函数的实参和
6、形参数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。2.指针变量作函数参数由于指针变量的值也是地址,数组指针变量的值即为数组的首地址,所以当然也可作为函数的参数使用。如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种:①形参和实参都是数组名。②实参用数组名,形参用指针变量。③实参、形参都用指针变量。④实参为指针变量,形参为数组名。8.4指向多维数组的指针和指针变量8.4.1二维数组的地址8.4.2指向二维数组的指针变量8.4.1二维数组的地址设有整型二维数组a[i][j
7、],数组及数组元素的地址表示如下:从二维数组的角度来看,a是二维数组名,代表整个二维数组的首地址,也是二维数组0行的首地址;a+1代表第一行的首地址;a[0]是第一个一维数组的数组名和首地址。*(a+0)或*a是与a[0]等效的,它表示一维数组a[0]0号元素的首地址;&a[0][0]是二维数组a的0行0列元素首地址。a+i,a[i],*(a+i),&a[i][0]是等同的。此外,&a[i]和a[i]也是等同的。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,由于*(
8、a+i)+j是二维数组a的i行j列元素的首地址,所以,该元素的值等于*(*(a+