C语言程序设计第8章-指针.ppt
《C语言程序设计第8章-指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第8章-指针.ppt(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言程序设计主编:连卫民 何 樱第8章 指针本章主要内容:本章主要内容:本章主要内容:本章主要内容:8.1 8.1 指针概述指针概述指针概述指针概述8.2 8.2 指针作为函数的参数(重点)指针作为函数的参数(重点)指针作为函数的参数(重点)指针作为函数的参数(重点)8.3 8.3 指针与数组(重点)指针与数组(重点)指针与数组(重点)指针与数组(重点)8.4 8.4 指针数组与多级指针指针数组与多级指针指针数组与多级指针指针数组与多级指针本章教学要求:本章教学要求:本章教学要求:本章教学要求:1.1.了解了解了解了解指针的程序设计方法指针的程序设计方法指针的程序设计方法指针的程序设计方法
2、2.2.熟悉熟悉熟悉熟悉指针函数和指向函数的指针变量的作用指针函数和指向函数的指针变量的作用指针函数和指向函数的指针变量的作用指针函数和指向函数的指针变量的作用 3.3.掌握掌握掌握掌握指针变量的定义、赋值和使用指针变量的定义、赋值和使用指针变量的定义、赋值和使用指针变量的定义、赋值和使用8.1 指针概述指针概述本节主要介绍指针的定义、引入指针处理数据的优势。本节主要介绍指针的定义、引入指针处理数据的优势。本节主要介绍指针的定义、引入指针处理数据的优势。本节主要介绍指针的定义、引入指针处理数据的优势。8.1.1 指针的概念指针的概念指针指针指针指针是一个其数值为地址的变量。是一个其数值为地址的
3、变量。是一个其数值为地址的变量。是一个其数值为地址的变量。指针变量指针变量指针变量指针变量不同于其他类型的变量,它是专门用来存不同于其他类型的变量,它是专门用来存不同于其他类型的变量,它是专门用来存不同于其他类型的变量,它是专门用来存放内存地址的。放内存地址的。放内存地址的。放内存地址的。说明:说明:说明:说明:由于指针变量是由于指针变量是由于指针变量是由于指针变量是“指向指向指向指向”某种类型数据的变量,因某种类型数据的变量,因某种类型数据的变量,因某种类型数据的变量,因此,在定义时,指针变量的类型由它所指向变量的此,在定义时,指针变量的类型由它所指向变量的此,在定义时,指针变量的类型由它所
4、指向变量的此,在定义时,指针变量的类型由它所指向变量的数据类型来确定。数据类型来确定。数据类型来确定。数据类型来确定。第8章 指针8.1 指针的基本概念指针的基本概念8.1.2 指针变量指针变量1.指针变量的定义 指针变量指针变量指针变量指针变量是存放一个变量地址的变量。指针变量不同于其他类是存放一个变量地址的变量。指针变量不同于其他类是存放一个变量地址的变量。指针变量不同于其他类是存放一个变量地址的变量。指针变量不同于其他类型的变量,它是专门用来存放内存地址的,也叫做地址变量。型的变量,它是专门用来存放内存地址的,也叫做地址变量。型的变量,它是专门用来存放内存地址的,也叫做地址变量。型的变量
5、,它是专门用来存放内存地址的,也叫做地址变量。定义指针变量的一般格式为:定义指针变量的一般格式为:类型名类型名类型名类型名 *指针变量名指针变量名指针变量名指针变量名;“类型名类型名类型名类型名”与指针变量所指向数据的类型一致与指针变量所指向数据的类型一致与指针变量所指向数据的类型一致与指针变量所指向数据的类型一致 指针变量名前的指针变量名前的指针变量名前的指针变量名前的“*”表示该变量为指针变量,要注意指针变量名本表示该变量为指针变量,要注意指针变量名本表示该变量为指针变量,要注意指针变量名本表示该变量为指针变量,要注意指针变量名本身是不带身是不带身是不带身是不带“*”的。的。的。的。以下是
6、指针变量的定义:以下是指针变量的定义:以下是指针变量的定义:以下是指针变量的定义:intint *p1,*p2;*p1,*p2;char *c2,*c2;char *c2,*c2;第8章 指针8.1 指针的基本概念指针的基本概念8.1.2 指针变量指针变量2.指针变量的赋值 指针变量赋值的一般格式为:指针变量赋值的一般格式为:指针变量赋值的一般格式为:指针变量赋值的一般格式为:指针变量指针变量指针变量指针变量=&=&变量变量变量变量;“&”是求地址运算符,放在变量名的前面,执行结果是取是求地址运算符,放在变量名的前面,执行结果是取是求地址运算符,放在变量名的前面,执行结果是取是求地址运算符,放
7、在变量名的前面,执行结果是取这个变量的地址,并通过赋值运算赋给相应的指针变量。这个变量的地址,并通过赋值运算赋给相应的指针变量。这个变量的地址,并通过赋值运算赋给相应的指针变量。这个变量的地址,并通过赋值运算赋给相应的指针变量。例如:例如:例如:例如:intint a=3;a=3;intint*p;*p;p=&a;p=&a;第8章 指针8.1 指针的基本概念指针的基本概念8.1.2 指针变量指针变量2.指针变量的赋值说明:说明:说明:说明:(1 1)下面有关指针变量的赋值是不合法的。)下面有关指针变量的赋值是不合法的。)下面有关指针变量的赋值是不合法的。)下面有关指针变量的赋值是不合法的。p=
8、a;p=0 x1000;a=p;p=a;p=0 x1000;a=p;(2 2)指针变量可以为空值,即该指针变量不指向任何变量,表示方法为:)指针变量可以为空值,即该指针变量不指向任何变量,表示方法为:)指针变量可以为空值,即该指针变量不指向任何变量,表示方法为:)指针变量可以为空值,即该指针变量不指向任何变量,表示方法为:p=NULL;p=NULL;或或或或 p=0;p=0;(3 3)指针变量间赋值,即用已赋过值的指针变量给相同类型的指针变量)指针变量间赋值,即用已赋过值的指针变量给相同类型的指针变量)指针变量间赋值,即用已赋过值的指针变量给相同类型的指针变量)指针变量间赋值,即用已赋过值的指
9、针变量给相同类型的指针变量赋值。赋值。赋值。赋值。p=q;p=q;p p和和和和q q指向了同一个变量。指向了同一个变量。指向了同一个变量。指向了同一个变量。第8章 指针8.1 指针的基本概念指针的基本概念8.1.2 指针变量指针变量2.指针变量的赋值【例【例【例【例8-18-1】输入两个整数输入两个整数输入两个整数输入两个整数a a和和和和b b,按由大到小顺序输出,按由大到小顺序输出,按由大到小顺序输出,按由大到小顺序输出a a和和和和b b。要求用。要求用。要求用。要求用指针变量实现数据的输入、比较和输出。指针变量实现数据的输入、比较和输出。指针变量实现数据的输入、比较和输出。指针变量实
10、现数据的输入、比较和输出。第8章 指针8.1 指针的基本概念指针的基本概念8.1.3 指针运算指针运算1.指向运算符指向运算符*与取地址运算符与取地址运算符&*指针变量名指针变量名指针变量名指针变量名“*”是指针取值运算符,是指针取值运算符,是指针取值运算符,是指针取值运算符,*p*p代表代表代表代表p p所指向的变量。所指向的变量。所指向的变量。所指向的变量。若若若若p=&ap=&a,则,则,则,则*p*p代表代表代表代表a a。【例【例【例【例8-28-2】阅读下列程序,注意指针变量的定义与使用。阅读下列程序,注意指针变量的定义与使用。阅读下列程序,注意指针变量的定义与使用。阅读下列程序,
11、注意指针变量的定义与使用。第8章 指针8.1 指针的基本概念指针的基本概念8.1.3 指针运算指针运算2.指针的算术运算指针的算术运算 指针可以与整数进行加减运算,指针与整数的加减运算结果与该指针指针可以与整数进行加减运算,指针与整数的加减运算结果与该指针指针可以与整数进行加减运算,指针与整数的加减运算结果与该指针指针可以与整数进行加减运算,指针与整数的加减运算结果与该指针所指向的数据类型有关。所指向的数据类型有关。所指向的数据类型有关。所指向的数据类型有关。p+np+n表示指针表示指针表示指针表示指针p p当前所指向位置后面第当前所指向位置后面第当前所指向位置后面第当前所指向位置后面第n n
12、个同类型数据的地址个同类型数据的地址个同类型数据的地址个同类型数据的地址 p-n p-n表示指针表示指针表示指针表示指针p p当前所指向位置前面第当前所指向位置前面第当前所指向位置前面第当前所指向位置前面第n n个同类型数据的地址。个同类型数据的地址。个同类型数据的地址。个同类型数据的地址。说明:说明:说明:说明:两个相同类型的指针可以相减,表示两个指针之间相隔的该种类型的两个相同类型的指针可以相减,表示两个指针之间相隔的该种类型的两个相同类型的指针可以相减,表示两个指针之间相隔的该种类型的两个相同类型的指针可以相减,表示两个指针之间相隔的该种类型的变量的个数。变量的个数。变量的个数。变量的个
13、数。两个相同类型的指针不能相加。两个相同类型的指针不能相加。两个相同类型的指针不能相加。两个相同类型的指针不能相加。第8章 指针8.1 指针的基本概念指针的基本概念8.1.3 指针运算指针运算3.指针的算术运算指向同一种数据类型的指针可以进行关系运算。指向同一种数据类型的指针可以进行关系运算。指向同一种数据类型的指针可以进行关系运算。指向同一种数据类型的指针可以进行关系运算。如果两个相同类型的指针相等,表示这两个指针指向同一个地址。如果两个相同类型的指针相等,表示这两个指针指向同一个地址。如果两个相同类型的指针相等,表示这两个指针指向同一个地址。如果两个相同类型的指针相等,表示这两个指针指向同
14、一个地址。指针也可以与指针也可以与指针也可以与指针也可以与0 0进行比较运算,如果进行比较运算,如果进行比较运算,如果进行比较运算,如果p=0p=0成立,我们称成立,我们称成立,我们称成立,我们称p p是一个空指针,是一个空指针,是一个空指针,是一个空指针,即指针即指针即指针即指针p p还没有具体指向。还没有具体指向。还没有具体指向。还没有具体指向。注意:注意:注意:注意:为了避免使用没有指向的指针,在定义指针变量时,可以将其初始化为了避免使用没有指向的指针,在定义指针变量时,可以将其初始化为了避免使用没有指向的指针,在定义指针变量时,可以将其初始化为了避免使用没有指向的指针,在定义指针变量时
15、,可以将其初始化为为为为0 0(也可以写成(也可以写成(也可以写成(也可以写成NULLNULL)。)。)。)。第8章 指针8.1 指针的基本概念指针的基本概念8.1.3 指针运算指针运算3.指针的算术运算指针的算术运算【例【例【例【例8-38-3】使用空指针。使用空指针。使用空指针。使用空指针。第8章 指针8.2 指针作为函数的参数指针作为函数的参数8.2.1指针变量作为函数参数传递数据指针变量作为函数参数传递数据指针变量作为函数参数传递数据,实际上是传送地址值,可以指针变量作为函数参数传递数据,实际上是传送地址值,可以指针变量作为函数参数传递数据,实际上是传送地址值,可以指针变量作为函数参数
16、传递数据,实际上是传送地址值,可以在被调用函数中引用调用函数中的变量。在被调用函数中引用调用函数中的变量。在被调用函数中引用调用函数中的变量。在被调用函数中引用调用函数中的变量。【例【例8-48-4】编写函数编写函数myaddmyadd(intint*a,*a,intint*b)*b),把,把a a和和b b所指向所指向存储单元中的两个值相加,然后将结果作为函数值返回。存储单元中的两个值相加,然后将结果作为函数值返回。在主函数中输入两个数给变量,把变量的地址作为实参,在主函数中输入两个数给变量,把变量的地址作为实参,传递给相应的形参。传递给相应的形参。第8章 指针8.2 指针作为函数的参数指针
17、作为函数的参数8.2.2 改变调用函数中变量的值改变调用函数中变量的值 在用一般变量作函数参数时,形参值的改变并不能改变对应在用一般变量作函数参数时,形参值的改变并不能改变对应在用一般变量作函数参数时,形参值的改变并不能改变对应在用一般变量作函数参数时,形参值的改变并不能改变对应的实参的值。的实参的值。的实参的值。的实参的值。把数据从被调用函数返回到调用函数的唯一途径是通过把数据从被调用函数返回到调用函数的唯一途径是通过把数据从被调用函数返回到调用函数的唯一途径是通过把数据从被调用函数返回到调用函数的唯一途径是通过returnreturn语句返回函数值,这就限定了只能返回一个数据。语句返回函数
18、值,这就限定了只能返回一个数据。语句返回函数值,这就限定了只能返回一个数据。语句返回函数值,这就限定了只能返回一个数据。在例在例在例在例8-18-1中通过传送地址值,可以在被调用函数中对调用函中通过传送地址值,可以在被调用函数中对调用函中通过传送地址值,可以在被调用函数中对调用函中通过传送地址值,可以在被调用函数中对调用函数中的变量进行引用,这也就使得通过形参改变对应实参的数中的变量进行引用,这也就使得通过形参改变对应实参的数中的变量进行引用,这也就使得通过形参改变对应实参的数中的变量进行引用,这也就使得通过形参改变对应实参的值有了可能。值有了可能。值有了可能。值有了可能。利用此形式就可以把两
19、个或两个以上的数据从被调用函数返利用此形式就可以把两个或两个以上的数据从被调用函数返利用此形式就可以把两个或两个以上的数据从被调用函数返利用此形式就可以把两个或两个以上的数据从被调用函数返回到调用函数。回到调用函数。回到调用函数。回到调用函数。第8章 指针8.2 指针作为函数的参数指针作为函数的参数8.2.2 改变调用函数中变量的值改变调用函数中变量的值【例【例【例【例8-58-5】通过调用通过调用通过调用通过调用swap()swap()函数,交换主函数中变量函数,交换主函数中变量函数,交换主函数中变量函数,交换主函数中变量x x和和和和y y中的数据。中的数据。中的数据。中的数据。第8章 指
20、针8.2 指针作为函数的参数指针作为函数的参数8.2.2 改变调用函数中变量的值改变调用函数中变量的值【例【例【例【例8-68-6】编写函数编写函数编写函数编写函数order(order(intint*a*a,intint*b)*b),使调用函数中,使调用函数中,使调用函数中,使调用函数中的第一个实参总是存放两个数中的最小数。第二个参数存的第一个实参总是存放两个数中的最小数。第二个参数存的第一个实参总是存放两个数中的最小数。第二个参数存的第一个实参总是存放两个数中的最小数。第二个参数存放两个数中较大的数。放两个数中较大的数。放两个数中较大的数。放两个数中较大的数。第8章 指针8.3 指针与数组
21、指针与数组8.3.1 一维数组和指针一维数组和指针1 1一维数组元素的地址一维数组元素的地址一维数组元素的地址一维数组元素的地址在在在在C C语言中,数组名可以认为是一个存放地址值的指针变量名,其中的地语言中,数组名可以认为是一个存放地址值的指针变量名,其中的地语言中,数组名可以认为是一个存放地址值的指针变量名,其中的地语言中,数组名可以认为是一个存放地址值的指针变量名,其中的地址值是数组第一个元素的地址,可以认为数组名是一个地址常量。址值是数组第一个元素的地址,可以认为数组名是一个地址常量。址值是数组第一个元素的地址,可以认为数组名是一个地址常量。址值是数组第一个元素的地址,可以认为数组名是
22、一个地址常量。若在函数体中有以下定义:若在函数体中有以下定义:若在函数体中有以下定义:若在函数体中有以下定义:intint a10,*a10,*p,xp,x;语句语句语句语句a=&xa=&x;或;或;或;或 a+a+;都是非法的,因为不能给;都是非法的,因为不能给;都是非法的,因为不能给;都是非法的,因为不能给a a重新赋地址值。一旦重新赋地址值。一旦重新赋地址值。一旦重新赋地址值。一旦定义,定义,定义,定义,a a永远指向永远指向永远指向永远指向a a数组的第一个数组元素。数组的第一个数组元素。数组的第一个数组元素。数组的第一个数组元素。由于数组在内存中占用一个连续的存储空间,所以,只要知道
23、了一维由于数组在内存中占用一个连续的存储空间,所以,只要知道了一维由于数组在内存中占用一个连续的存储空间,所以,只要知道了一维由于数组在内存中占用一个连续的存储空间,所以,只要知道了一维数组的首地址,在首地址上加一个整数数组的首地址,在首地址上加一个整数数组的首地址,在首地址上加一个整数数组的首地址,在首地址上加一个整数i(i=0)i(i=0),就可以表示其后的第,就可以表示其后的第,就可以表示其后的第,就可以表示其后的第i i个元素的地址。个元素的地址。个元素的地址。个元素的地址。第8章 指针8.3 指针与数组指针与数组8.3.1 一维数组和指针一维数组和指针2 2通过指针引用一维数组元素通
24、过指针引用一维数组元素通过指针引用一维数组元素通过指针引用一维数组元素如果我们定义一个指针,让它指向一个一维数组,可以通过这个指针引如果我们定义一个指针,让它指向一个一维数组,可以通过这个指针引如果我们定义一个指针,让它指向一个一维数组,可以通过这个指针引如果我们定义一个指针,让它指向一个一维数组,可以通过这个指针引用一维数组的每一个元素。例如:用一维数组的每一个元素。例如:用一维数组的每一个元素。例如:用一维数组的每一个元素。例如:intint a10,*a10,*p,ip,i;p=a;p=a;/*/*获取数组的首地址获取数组的首地址获取数组的首地址获取数组的首地址*/*/for(i=0;i
25、10;i+)for(i=0;i10;i+)/*/*通过指针通过指针通过指针通过指针p p输入输入输入输入1010个数个数个数个数*/*/scanfscanf(%d,(%d,p+ip+i););for(i=0;i10;i+)for(i=0;i10;i+)/*/*获取指针获取指针获取指针获取指针p p输出输出输出输出1010个数个数个数个数*/*/printfprintf(%5d,*(%5d,*(p+ip+i););第8章 指针8.3 指针与数组指针与数组8.3.1 一维数组和指针一维数组和指针【例【例【例【例8-78-7】编写程序,通过指针正入倒出编写程序,通过指针正入倒出编写程序,通过指针正入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 指针
限制150内