指针-PPT课件(同名215).ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《指针-PPT课件(同名215).ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 PPT 课件 同名 215
- 资源描述:
-
1、指针是指针是C C语言中的一个概念,正确而灵活地语言中的一个概念,正确而灵活地运用指针,可以有效地表示复杂的数据结构、运用指针,可以有效地表示复杂的数据结构、难动态分配内存、方便使用字符串和数组、能难动态分配内存、方便使用字符串和数组、能使函数返回一个以上的结果、能直接使用内存使函数返回一个以上的结果、能直接使用内存地址等。地址等。本章内容包括:本章内容包括:10.1 10.1 地址和指针的概念地址和指针的概念10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 10.3 10.3 数组与指针数组与指针10.4 10.4 字符串与指针字符串与指针10.5 10.5
2、指向函数的指针指向函数的指针10.6 10.6 返回指针值的函数返回指针值的函数10.7 10.7 指针数组与指向指针的指针指针数组与指向指针的指针10.1地址和指针的概念地址和指针的概念一、指针概述:一、指针概述:1 1、地址的概念与取地址运算地址的概念与取地址运算: 内存以字节编码,每个编码都是一个地址。我们原先学过的内存以字节编码,每个编码都是一个地址。我们原先学过的变量、数组、函数等都放在内存中,在程序中,我们是通过变量变量、数组、函数等都放在内存中,在程序中,我们是通过变量名等使用变量、给变量赋值等,但实际运行时,系统使用的是内名等使用变量、给变量赋值等,但实际运行时,系统使用的是内
3、存地址,而不是变量名。我们怎样知道机器将某种数据放在内存存地址,而不是变量名。我们怎样知道机器将某种数据放在内存的什么地方呢?可用求地址运算符的什么地方呢?可用求地址运算符& & 如:如:int int a = 3 ; &a a = 3 ; &a 就是变量在内存中的地址。就是变量在内存中的地址。 可以用可以用printfprintf(“%x n” , &a); (“%x n” , &a); 看出其地址。看出其地址。注意,这个注意,这个地址并不是始终不变的,这是由机器和操作系统来安排的,我们地址并不是始终不变的,这是由机器和操作系统来安排的,我们无法预先知道。无法预先知道。 在数组中,数组名代表
4、数组的首地址在数组中,数组名代表数组的首地址 故故a表示的地址和表示的地址和&a 0的地址相同。的地址相同。 但但&不能施加在常数、常量或表达式上,也不能施加在寄存器变量上不能施加在常数、常量或表达式上,也不能施加在寄存器变量上(因为寄存器变量在(因为寄存器变量在cpu中,不在内存中)。中,不在内存中)。二、指针变量:二、指针变量: 既然存储在内存中的各种变量都有一个地址,我们能否这样设想:定既然存储在内存中的各种变量都有一个地址,我们能否这样设想:定义某种变量,让这个变量的值等于某个变量的地址,如同某个房间号、义某种变量,让这个变量的值等于某个变量的地址,如同某个房间号、门牌号一样?回答是肯
5、定的。我们把门牌号一样?回答是肯定的。我们把这种存放某种变量地址的变量称为这种存放某种变量地址的变量称为指针变量。指针变量。 1035.ab20102012p2010q2012因此,在因此,在C语言中,将地语言中,将地址形象化地称为址形象化地称为指针指针说明说明(系统对变量的访问形式分为两种系统对变量的访问形式分为两种)一个变量的访问(访问是指取出其值或向它赋值)方式一个变量的访问(访问是指取出其值或向它赋值)方式有两种:有两种:(1)直接访问,通过变量名访问,如通过变量名)直接访问,通过变量名访问,如通过变量名i直接访直接访问。问。(2)间接访问,通过该变量的指针来访问,如通过)间接访问,通
6、过该变量的指针来访问,如通过指针指针p访问变量访问变量i。 1.1.内存地址内存地址内存中存储单元的编号内存中存储单元的编号(1 1)计算机硬件系统的内存储器中,拥有大量的存储)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为字节)。单元(容量为字节)。为了方便管理,必须为每一个存储单元编号,这个编为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的号就是存储单元的 地址地址 。每个存储单元都有一个惟。每个存储单元都有一个惟一的地址。一的地址。(2 2)在地址所标识的存储单元中存放数据。)在地址所标识的存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完注意:内存
7、单元的地址与内存单元中的数据是两个完全不同的概念。全不同的概念。2.2.指针指针即地址即地址 一个变量的地址称为该变量的指针。通过变量的指针一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量能够找到该变量2.2.变量地址变量地址系统分配给变量的内存单元的起始地系统分配给变量的内存单元的起始地址。址。假设有这样一个程序:假设有这样一个程序:main()main() int i; int i; scanf(%d,&i); scanf(%d,&i); printf printf(i=%dn, i);(i=%dn, i); C C编译程序编译到该变量定义语句时,将变量编译程序编译到该变量定义
8、语句时,将变量i i 登录到登录到 符号表符号表 中。符号表的关键属性有两个:一是中。符号表的关键属性有两个:一是 标识符名(标识符名(idid) ,二,二是该标识符在内存空间中的是该标识符在内存空间中的 地址(地址(addraddr) 。为描述方便,假设系统分配给变量为描述方便,假设系统分配给变量i i的的2 2字节存储单元为字节存储单元为 2000 2000 和和20012001,则起始地址,则起始地址20002000就是变量就是变量i i在内存中的地址。在内存中的地址。3.3.变量值的存取变量值的存取通过变量在内存中的地址进行通过变量在内存中的地址进行系统执行系统执行 scanfscan
9、f(%d,&i);(%d,&i);和和 printfprintf(i=%dn, i);(i=%dn, i);时,时,存取变量存取变量i i值的方式可以有两种:值的方式可以有两种:(1)(1)直接访问直接访问直接利用变量的地址进行存取直接利用变量的地址进行存取 1)1)上例中上例中scanfscanf(%d,&i)(%d,&i)的执行过程是这样的:的执行过程是这样的: 用变量名用变量名i i作为索引值,检索符号表,找到变量作为索引值,检索符号表,找到变量i i的的起始地址起始地址20002000;然后将键盘输入的值(假设为)送;然后将键盘输入的值(假设为)送到内存单元到内存单元20002000和
10、和20012001中。此时,变量中。此时,变量i i在内存中的地在内存中的地址和值,如图址和值,如图10-110-1所示。所示。 2 2)printfprintf(i=%dn,i)(i=%dn,i)的执行过程,与的执行过程,与scanfscanf()()很很相似:相似: 首先找到变量首先找到变量i i的起始地址的起始地址20002000,然后从,然后从20002000和和20012001中取出其值,最后将它输出。中取出其值,最后将它输出。 (2 2)间接访问间接访问通过另一变量访问该变量的值通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量(称语言规定:在程序中可以定义一种特
11、殊的变量(称为指针变量),用来存放其它变量的地址。为指针变量),用来存放其它变量的地址。例如,假设定义了这样一个指针变量例如,假设定义了这样一个指针变量i_pointeri_pointer,它被分配到,它被分配到30103010、30113011单元,其值可通过赋值语句单元,其值可通过赋值语句i_pointer=i_pointer=i;i;得到。得到。此时,指针变量此时,指针变量i_pointeri_pointer的值就是变量的值就是变量i i在内存中的起始地址在内存中的起始地址20002000,如图,如图10-110-1所示。所示。通过指针变量通过指针变量i_pointeri_pointer
12、存取变量存取变量i i值的过程如下:值的过程如下:首先找到指针变量首先找到指针变量i_pointeri_pointer的地址(的地址(30103010),取出其值),取出其值20002000(正好是变量(正好是变量i i 的起始地址)的起始地址); ; 然后从然后从20002000、20012001中取出变量中取出变量i i的值(的值(3 3)。)。 (3 3)两种访问方式的比较)两种访问方式的比较 两种访问方式之间的关系,可以用某人甲(系统)要找某人乙两种访问方式之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。(变量)来类比。一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。
13、一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙(即间接访问)。(即间接访问)。10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量(1 1)指针)指针即地址即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。该变量。(2 2)指针变量)指针变量专门用于存储其它变量地址的变量专门用于存
14、储其它变量地址的变量指针变量指针变量i_pointeri_pointer的值就是变量的值就是变量i i的地址。指针与指针变量的的地址。指针与指针变量的区别,就是变量值与变量的区别。区别,就是变量值与变量的区别。(3 3)为表示指针变量和它指向的变量之间的关系,用指针运算)为表示指针变量和它指向的变量之间的关系,用指针运算符符 * * 表示。表示。 例如,指针变量例如,指针变量i_pointeri_pointer与它所指向的变量与它所指向的变量i i的关系,表示为:的关系,表示为:* *i_pointeri_pointer,即,即* *i_pointeri_pointer等价于变量等价于变量i
15、i。因此,下面两个语句的作用相同:因此,下面两个语句的作用相同:i=3;i=3; / /* *将将3 3直接赋给变量直接赋给变量i i* */ /i_pointer=&i; /i_pointer=&i; /* *使使i_pointeri_pointer指向指向i i * */ /* *i_pointer=3;i_pointer=3; / /* *将将3 3赋给指针变量赋给指针变量i_pointeri_pointer所指向所指向的变量的变量* */ /10.2.1定义一个指针变量定义一个指针变量指针变量的定义一般形式为:指针变量的定义一般形式为:基类型基类型*指针变量名指针变量名;例如:例如:i
16、nt i, j, int i, j, * *pi, pi, * *pjpj; ; float x, y, float x, y, * *p1, p1, * *p2;p2;指针变量的赋值:使得指针变量指向变量指针变量的赋值:使得指针变量指向变量指针变量名指针变量名& &变量名变量名; ;如:如: pi=&i; pjpi=&i; pj=&j; p1=&y; p2=&x;=&j; p1=&y; p2=&x;注意:指针变量只能存放指针(地址),且只能是相同类型变量注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。的地址。例如,指针变量例如,指针变量pipi、pjpj,只能接收,只能接收i
17、ntint型、型、p1, p2p1, p2只能接收只能接收floatfloat型的地址,否则出错型的地址,否则出错。10.2.2指针变量的引用在程序中,可以用:在程序中,可以用:*指针变量名代替其所指变量。如若指针变量名代替其所指变量。如若int i, *p; p=&i;则则 i=5;与与*p=5;的作用相同,即可用的作用相同,即可用*p代替代替i,这里这里*号称为指号称为指针运算符(或称为间接访问运算符)针运算符(或称为间接访问运算符)例例10.1通过指针变量访问整型变量通过指针变量访问整型变量main()int a, b, point_1, point_2;a=100; b=10;poin
18、t_1=&a; point_2=&b;printf(n%d,%dn,a,b);printf(%d,%d,*point_1,*point_2);例例10.2输入输入a和和b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a和和b的值的值main()int a, b, *p, *p1, *p2;p1=&a;p2*=&b;scanf(%d%d,p1,p2);if(ab) p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%d,*p1,*p2);getch();10.2.3 指针变量作为函数参数实参:变量地址或已赋值的指针变量
19、,形参:指针变量实参:变量地址或已赋值的指针变量,形参:指针变量功能:地址传送方式,会将改变后的值带回。功能:地址传送方式,会将改变后的值带回。例例10.3通过函数调用实现例通过函数调用实现例10.2的功能。的功能。swap(int *p1, int *p2)int temp;temp=*p1; *p1=*p2; *p2=temp;main()int a, b, *pointer1,*pointer2;scanf(%d%d,&a,&b);pointer1=&a; pointer2=&b;if(ab) swap(&a,&b);printf(n%d,%d,a,b);例例10.4输入输入3个整数,按
20、降序(从大到小的顺序)输出。要求使用变量个整数,按降序(从大到小的顺序)输出。要求使用变量的指针作函数调用的实参来实现。的指针作函数调用的实参来实现。void exchange(int *pointer1, int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; main() int a,b,c; printf(Input the first number: ); scanf(%d, &a); printf(Input the second number: ); scanf(%d, &b); p
21、rintf(Input the third number: ); scanf(%d, &c); printf(a=%d, b=%d, c=%dn, a, b, c); /*排序排序*/ if( a b ) /*ab*/ exchange( &a, &b ); if( a c ) exchange( &a, &c ); if( b c ) exchange( &b, &c ); printf(排序结果排序结果: %d, %d, %dn,a,b,c); getch(); 10.3数组与指针10.3.1指向数组元素的指针指向数组元素的指针1.概念概念数组的指针数组的指针数组在内存中的起始地址,数组元
22、素的指针数组在内存中的起始地址,数组元素的指针数组元素在内存中的起始地址。数组元素在内存中的起始地址。2.指向数组的指针变量的定义指向数组的指针变量的定义指向数组的指针变量的定义,与指向普通变量的指针变量的定指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。义方法一样。例如,例如,int a 10, *p=a (或或&a 0);或者:或者: int a 10, *p; pa;注意注意:数组名代表数组在内存中的起始地址(与第:数组名代表数组在内存中的起始地址(与第1个元素的地个元素的地址相同),所以可以用数组名给指针变量赋值址相同),所以可以用数组名给指针变量赋值3.3.数组元素
23、的引用数组元素的引用数组元素的引用,既可用下标法,也可用指针法。使用下标法,数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而使用指针法,能使目标程序占用内存少、运行速度快。直观;而使用指针法,能使目标程序占用内存少、运行速度快。10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素如果有如果有“intint a 10, a 10,* *p=a;” p=a;” ,则:,则:(1 1)p+ip+i和和a+ia+i都是数组元素都是数组元素a ia i的地址,如图的地址,如图10.1310.13所示。所示。 (2 2)* *(p+i)(p+i)和和* *(a+i)(a+i
24、)就是数组元素就是数组元素a ia i。(3 3)指向数组的指针变量,也可将其看作是数组名,因而可按)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,下标法来使用。例如,pipi等价于等价于* *( (p+i)p+i)。注意注意:p+1p+1指向数组的下一个元素,而不是简单地使指针变量指向数组的下一个元素,而不是简单地使指针变量p p的值的值+1+1。其实际变化为。其实际变化为p+1p+1* *size(sizesize(size为一个元素占用的字节为一个元素占用的字节数)。数)。例 如 , 假 设 指 针 变 量例 如 , 假 设 指 针 变 量 p p 的 当 前 值
25、 为的 当 前 值 为 3 0 0 03 0 0 0 , 则, 则 p + 1p + 1 为为3000+13000+1* *2=30022=3002,而不是,而不是30013001例例10.5输出数组的全部元素输出数组的全部元素法一:下标法 main()int a10,i;for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i+) printf(%5d,ai);getch();法二:用数组名计算数组元素地址main()int a10,i;for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i
展开阅读全文