版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章,指针,1/55,8.1 指针的概念 8.2 指针变量的定义和引用 8.3 指针与数组 8.4 指针与字符串 8.5 指针数组与指向指针的指针 8.6 返回指针值的函数 8.7 本章要点小结 8.8 本章程序举例,2/55,8.1 指针的概念,一、数据的存取,1、内存地址,内存的每个字节都有一个编号,这个编号称为“内存地址,程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据,int i, j, k,i,j,k,2、内存单元的地址和内存单元的内容的区别,若i=3, j=5,从图中可以看出它们的区别,3/55,程序编译后已经没有i、j、k这些变量名了,而是将
2、变量名转换为变量的地址,计算机通过内存地址对变量进行存取,二、直接访问和间接访问,1、直接访问方式,i=3,j=i+2,printf(%d, i,scanf(%d,k=i+j; 如何执行,按变量的地址存取变量的方式,2、间接访问方式,语言中可以定义整型变量、实型变量、字符型变量,各自存放相应类型的数据;另外还可以定义和使用一种特殊类型的变量,用来存放变量的地址,4/55,假设已经定义变量 ip 用来存放整型变量的地址,它被分配到内存单元3000和3001,ip,通过执行语句:ip= 将整型变量i 的地址存放到变量ip中,即ip的值为变量i所对应的内存单元的起始地址2000,2000,现在要存取
3、i的值可以这样做:先找到存放i的地址的内存单元地址(3000和3001),从中取出变量i的地址(2000),然后再对2000和2001单元进行存取这就称为间接访问,3、关于“指向”的含义,变量ip的值为2000,即变量i的地址,这样就在ip和i之间建立了一种联系,5/55,通过变量ip知道变量i的地址,从而找到变量i的内存单元,因此说变量ip指向变量i,用箭头表示这种“指向”关系,4、为了表示将数值10送到变量i中,可以有两种表示方法,将10送到变量i所标志的单元中,10,将10送到变量ip所指向的单元中,10,6/55,三、指针与指针变量,通过地址能找到所需的变量单元,可以说:地址“指向”该
4、变量单元。因此,把一个变量的地址称为该变量的“指针,如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址,注意区分“指针”和“指针变量”这两个概念,四、说明,程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的,7/55,数据所占有的内存单元个数是由其数据类型决定的,首地址:即第一个单元的地址,表示地址的数与整数的区别,变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心,8/55,8.2 指针变量的定义和引用,8.2.1 概述,1、指针运算符:,为了表示指针变量和它所指向的变量之间的联
5、系,用“*”表示指向的关系,如:ip代表指针变量,*ip表示ip所指向的变量。即*ip也代表一个变量,9/55,例,若:ip= x=4,int i, *p1,int i, *p1; p1,12/55,3、说明,指针变量定义后,若不赋值,其值是不确定的,可以给指针变量赋空值(NULL),使指针变量不指向任何变量,ip=NULL,define NULL 0,指针变量的值为空值(NULL)与未对指针变量赋值,意义不同,只能是同类型变量的地址进行赋值,int i, *ip; char ch, *cp,ip,ip,可以将数组名或函数名赋给某些类型的指针变量,int a10, *ip,ip,ip=a,不能
6、将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量,int *ip,ip=3000,13/55,4、分析有关指针的程序时,画图是很好的方法,若有:int i, *p,p,i=5,int i, *p,p,i,i=5,5,8.2.3 指针变量的引用,int a, *p1, *p2; p1,int a, *p1, *p2,p1,a,printf(%x, p1,p2=p1,a,p1=3,3,printf(%d, *p1,14/55,1、两个运算符: p,int a, *p; *p,3、指针变量可以进行的操作,int a, *p1, *p2,赋值,p1,p2=p1,输出,printf(%x, p
7、1,取内容,p1=5,a=5,printf(%d, *p1,15/55,例8.1,include void main( ) int a1=11, a2=22; int *p1, *p2; p1=,a1,a2,p1,p2,a1,p2,p2,多个指针可以指向同一个存储单元。但在某一时刻,一个指针变量只能指向一个存储单元,因为指针变量在某一时刻只能存放一个变量的地址值,Eg801.cpp,16/55,例8.2,include void main( ) int a1=11, a2=22; int *p1, *p2, *p; p1=,a1,a2,p1,p2,a1,a2,p1,p1,a1,p2,p2,使两
8、个指针交换指向,Eg802.cpp,17/55,例8.3,include void main( ) int a1=11, a2=22, t; int *p1, *p2; p1=,a1,p1,a2,p2,11,22,11,交换两个指针变量所指向变量的值,Eg803.cpp,18/55,反映了指针变量的引用方法,将变量的地址赋给指针变量(p1= temp=x; x=y; y=temp; void main( ) int a, b; printf(nInput a, b: ); scanf(%d%d,注意:语言中的函数调用采用“传值”方式,即单向传递方式,即:主调函数可以将实参的值传递给被调函数的形
9、参,但不能通过改变形参的值而改变实参的值,Eg804.cpp,20/55,include void swap(int *px, int *py) int temp; temp=*px; *px=*py; *py=temp; void main( ) int a, b, *p1, *p2; printf(nInput a, b: ); scanf(%d%d,a,b,8,5,Eg805.cpp,21/55,include void swap(int *px, int *py) int *temp; *temp=*px; *px=*py; *py=*temp; void main( ) int a,
10、 b, *p1, *p2; printf(nInput a, b: ); scanf(%d%d,temp是指针变量temp所指向的变量,但temp中并无确定的地址值,其值不确定;*temp所指向的单元也不确定。因此,对*temp赋值可能会破坏系统的正常工作状况,应该将*px的值赋给一个整型变量,用整型变量作为临时存储空间实现*px和*py的交换,22/55,include void swap(int *px, int *py) int *p; p=px; px=py; py=p; void main( ) int a, b, *p1, *p2; printf(nInput a, b: ); s
11、canf(%d%d,a,b,b,a,Eg806.cpp,23/55,如果想通过函数调用得到几个要改变的值,可以,在主调函数中设n个变量,将n变量的地址作为实参传给所调用的函数的形参,通过形参指针变量,改变该n个变量的值,主调函数就可以使用这些改变了的值,例8.5 编写函数,求一维数组中的最大值和最小值,void search(int x , int n),int *pmax, int *pmin,pmax=*pmin=x0,for (i=1; in; i,if (*pmaxxi) *pmax=xi,if (*pminxi) *pmin=xi,int a20, max, min; for (i=
12、0; i20; i+) scanf(%d,search(a, 20,Eg807.cpp,24/55,8.3 指针与数组,8.3.1 指向数组元素的指针变量,1、几个概念,一个变量有地址,称变量的地址为该变量的指针,每个数组都有一个起始地址,数组的起始地址称为数组的指针,一个数组包含若干元素,每个数组元素都在内存中占用一定的存储单元,即都有相应的地址,数组元素的地址称为数组元素的指针,指针变量可以指向变量,当然也可以指向数组和数组元素,数组元素的指针变量就是专门用来存放数组元素地址的变量,2、定义,类型名 *指针变量名,int a10; int *p,int a10, *p,25/55,3、赋值
13、,p,a0,4、说明,语言中的数组名代表数组首地址,即第0号元素的地址,p,p=a,定义时可以进行初始化,int *p,int *p; p,int *p; *p,int *p=a,26/55,8.3.2 通过指针访问一维数组,1、数组元素的引用,int a10, *p,p=a,p=5,a0=5,p,p=5,a3=5,2、语言规定:无论数组的数据类型如何,若指针变量p已指向数组中的某一元素,则p+1指向同一数组中的下一个元素(而不是将p简单的加1,例如,int x10, *p=x,对于指向整型数组的指针变量p,p+1意味着使p在原值的基础上加2个字节,以使它指向下一元素,float x10, *
14、p=x,对于指向float型数组的指针变量p,p+1意味着使p在原值的基础上加4个字节,以使它指向下一元素,27/55,总之:设d是一个数组元素所占的字节数,则p+i表示指针移动了i个元素,而它实际的地址变化为:p+i*d,3、在使用指针变量引用数组时,应注意以下问题,给指针赋初值的方法,p=a; 或p,p+1或a+1实际上表示数组元素a1的地址( p(a+10); p+) printf(%4d, *p,for (p=a; a(p+10); a+) printf(%4d, *a,在程序运行期间,要始终注意指针变量当前所指向的是哪一个元素,Eg809.cpp,29/55,可以执行p+等操作使p指
15、向不同的数组元素,通过*p访问不同的数组元素。但要始终注意p当前所指向的是哪一个数组元素,通过指针在函数间传递一维数组,编译系统都是将形参数组名作为指针变量来处理的,f(int x , int n,f(int *x, int n,可以通过xi、*(x+i)来访问实参数组元素,要求实参为指向数组首元素的指针,a 或 p,f(a, 10,f(p, 10,p=a;,30/55,小结,int a10, *p; p=a; 或 p,p为指向数组元素的指针,语言规定:数组名表示数组的首地址,即第0个元素的地址;即数组名是指向数组第0个元素的指针常量,a+i,p+i,表示数组第 i 个元素的地址( print
16、f(%sn, s);,35/55,2、用字符指针指向一个字符串,static char s =I love China!; char *p; p=s; printf(%sn, p,对于指向字符的指针变量,除了可以把字符数组名(指向字符的指针常量)赋给它外,还可以将一个字符串常量赋给它,char *cp; cp=Hello, world,也可以在定义时赋初值,char *cp= Hello, world,语言在处理字符串常量时,在内存中开辟连续的存储单元,存放字符串中的各字符和字符串结束标志0,对指针变量赋值的作用是:将字符串在内存中的首地址赋给指针变量,Eg813.cpp,36/55,不同于用
17、字符串常量对字符数组赋初值,char ca =Hello, world,其作用是:将字符串中的各字符和结束标志0存放到数组ca的各元素中,数组的首地址用数组名ca表示,例8.8:将字符数组a中的字符串复制到字符数组b中,下标法,include void main( ) char a =Hello, World!, b20; int i; for (i=0; ai!=0; i+) bi=ai; bi=0; printf(%sn, b);,指针法,include void main( ) char a =Hello, World!, b20; char *pa=a, *pb=b; for ( ;
18、*pa!=0; pa+, pb+) *pb=*pa; *pb=0; printf(%sn, b);,Eg814.cpp,37/55,三、字符数组与字符指针变量的比较,字符数组由若干个元素组成,每个元素中存放着一个字符;而字符指针变量中存放的是地址,不是将字符串放到字符指针变量中,赋值方式,char str20; str20=I love China,char *ps; ps=I love China,对字符指针变量赋初值,char *s=I love China,char *s; s=I love China,char str =I love China,char str14; strcpy(
19、str, I love China,字符指针变量是可以改变的,char s20, *ps,38/55,8.4.2 通过指针在函数间传递字符串,将一个字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名、指向字符串的指针变量或其它字符地址表达式作参数,1、用字符数组作实参,main( ) char a=abcdefg; char b=12345; copy_string(a, b);,void copy_string(char to, char from) int i=0; while (fromi!=0) toi=fromi; i+; toi=0;,2、用字符指针变量作实参,
20、char *a=abcdefg; char *b=12345; copy_string(a, b,void copy_string(char *to, char *from) for ( ; *from!=0; from+, to+) *to=*from; *to=0;,Eg815.cpp,39/55,3、可以对copy_string函数作下列简化,void copy_string(char *to, char *from) while ( (*to=*from)!=0 ) to+; from+;,while (*to=*from,void copy_string(char *to, char
21、 *from) while ( (*to+=*from+)!=0 ),while (*to+=*from,void copy_string(char *to, char *from) while (*from!=0 ) *to+=*from+;,to=0,while (*from,40/55,void copy_string(char *to, char *from) for ( ; (*to+=*from+)!=0; ) ;,void copy_string(char *to, char *from) for ( ; (*to+=*from+) ; ) ;,4、对copy_string函数的
22、调用形式,char s120=12345, s2 =How are you,copy_string(s1, s2,s1: How are you,copy_string(s1, s2+2,s1: w are you,copy_string(s1+2, s2,s1: 12How are you,Eg816.cpp,41/55,8.5 指针与多维数组,数组是具有相同数据类型数据的集合。数组的每个元素又可以是一个数组,根据语法规定:如果 x 指向某一维数组,则xi与*(x+i)等价, for (i=0; in; i+) for (j=0; j4; j+) if (mpaij) m=paij; ret
23、urn(m);,*(pa+i)+j,*(pa+i)j,int max_value(int pa 4, int n,int max_value(int 4, int,int max_value(int (*)4, int,方法二,int max_value(int *p, int n) int m=*p; for (i=0; im) m=*p; return(m);,Eg820.cpp、Eg821.cpp,49/55,8.11 本章小结,一、有关指针的数据类型,int *p,p为指向整型数据的指针变量,char *p,p为指向字符型数据的指针变量,int (*pa)n,pa为指向一维数组的指针变
24、量(指向具有n个元素的一维数组,指针变量在定义时必须写成如上形式,但在作函数形参时可写成几种等价形式,int *p; 可写成:int p,char *cp; 可写成:char cp,int (*pa)5; 可写成:int pa5,50/55,二、指针运算小结,1、指针变量加(减)一个整数,例如:p+、p-、p+i、p-i、p+=i、p-=i等,语言规定:一个指针变量加(减)一个整数并不是简单地将指针变量加(减)一个整数,而是将它所指向的变量所占用的内存单元字节数相加(减,p+i,p+i*d,2、指针变量的赋值,int i, a10, *p, *p1, *p2,p,p=a,p2,p1=p2,注意,不能把整数赋值给指针变量,也不能把指针变量的值赋值给整型变量,51/55,3、指针变量可以有空值,即该指针变量不指向任何变量,p=NULL,define NULL 0,注意,p的值为NULL与未对p赋值不同,任何指针变量或地
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年辽宁省兴城市高一化学上册期末考试模拟试卷含答案
- 《机器学习Python实战》电子教案 13-2-项目9 k 均值聚类算法实战
- 消防设施月度维保记录表
- 矿井轨道工道德水平考核试卷含答案
- 海藻饲料肥料制作工安全宣贯知识考核试卷含答案
- 木材检验员岗前绩效评估考核试卷含答案
- 塑石工岗前复试考核试卷含答案
- 光纤光缆制造工岗前履职考核试卷含答案
- 柠檬酸充填封装工岗中新工艺考核试卷含答案
- 合成氨生产工安全知识竞赛评优考核试卷含答案
- 2026年国能源招聘笔试真题及答案
- GB/T 24134-2026橡胶和塑料软管静态条件下耐臭氧性能的评价
- 2026年交安C证考试模拟考试题库及答案
- AQ3026-2026《化工企业设备检修作业安全规范》解读
- 水利水电工程单元工程施工质量检验表与验收表(SLT631.5-2025)
- 筋膜刀课件教学课件
- 2025宁波北仑区总工会公开招聘工会社会工作者7人备考题库(含答案详解)
- Unit4HistoryandTraditions一轮词汇复习课件-高三英语人教版
- 安全风险管控“六项机制”监理实施细则(水利工程)
- 2025-2026学年(人教版)初中数学七年级上册第一次月考 (1-2章)(含答案)
- 《管理学》(第二版)课件全套 高教版马工程 第0-16章 绪论 - 组织变革与创新
评论
0/150
提交评论