版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 指 针Chapter 5 Pointer第五章第五章 指指 针针PointerPointer第五章 指 针Chapter 5 Pointer5.1 指针的概念指针的概念 指针是指针是C言语的重要特征,是言语的重要特征,是C言语访问内存数据和程序的灵敏言语访问内存数据和程序的灵敏和有效的手段。和有效的手段。 C C言语的指针支持:言语的指针支持: 函数的地址调用;函数的地址调用; 动态分配内存;动态分配内存; 数组的地址援用。数组的地址援用。第五章 指 针Chapter 5 Pointer内存、地址、指针内存、地址、指针 (Memory ,Address, Pointer) (Memor
2、y ,Address, Pointer) 内存存放了计算机正在运转的程序和程序正在运用的数据。内内存存放了计算机正在运转的程序和程序正在运用的数据。内存的根本单元是字节存的根本单元是字节(Byte)。 为了访问内存单元,为了访问内存单元,CPU给每个内存单元一个编号,该编号称给每个内存单元一个编号,该编号称为该内存单元的地址。为该内存单元的地址。 变量是程序中可以改动的量,当说变量是程序中可以改动的量,当说明变量时,系统将为其在内存中开辟相明变量时,系统将为其在内存中开辟相应得内存单元。由此确定变量的地址及应得内存单元。由此确定变量的地址及内存中的表示方式。内存中的表示方式。2000H2019
3、H2019H2019Hint a=0;a的的内内存存单单元元a的地址的地址&a 假设有一变量假设有一变量p,其内容存放了,其内容存放了a的的地址地址&a,经过,经过p也可实现对也可实现对a的访问,的访问,p称为指针,并指向称为指针,并指向a。00H20H00p第五章 指 针Chapter 5 Pointer指针的阐明指针的阐明 指针是特殊类型的变量,其内容是变量的地址。在运用前必需指针是特殊类型的变量,其内容是变量的地址。在运用前必需阐明,阐明某标识符是指针类型,并可指向某种类型的对象。阐明,阐明某标识符是指针类型,并可指向某种类型的对象。指针的阐明格式:指针的阐明格式: type *pnam
4、e1,*pnamen;标识符命名的指针变量名。标识符命名的指针变量名。指针标志。指针标志。指针指向对象的类型。指针指向对象的类型。int *p, *q; /* p、q是指向整型变量的指针。是指向整型变量的指针。*/float *pfValue ,*pf; /* pfValue和和pf是指向浮点型的指针。是指向浮点型的指针。*/第五章 指 针Chapter 5 Pointer指针对变量的援用指针对变量的援用 定义指针的目的是经过指针援用内存对象,指针的援用应按如定义指针的目的是经过指针援用内存对象,指针的援用应按如下步骤进展:下步骤进展:阐明指针阐明指针 int a=0, *p;指针指向对象指针
5、指向对象p=&a;经过指针援用对象经过指针援用对象*p=*p+2;指针操作的两种运算:指针操作的两种运算:取地址运算取地址运算 & &a表示取变量表示取变量a地址的运算。地址的运算。间接运算间接运算 * *p表示取指针表示取指针p指向变量内容的运算。指向变量内容的运算。int a,*p; 2000Happ=&a; /* p指向指向a。 */2000H*p=2;2第五章 指 针Chapter 5 Pointer举例:举例:#include void main (void ) int x ,*p; x=55; p=&x; printf ( “ %d, %u , x, *p) ; *p=65; pr
6、intf ( “ %d, %u, x, *p) ;2000Hxp2000H5565关于指针的阐明:关于指针的阐明:指针必需指向对象后,才干援用。指针必需指向对象后,才干援用。 int *p; *p=2; /* Error! */ &和和 * 为互补运算。为互补运算。int a,*p; p=&a;那么:那么:&*p p *&a a第五章 指 针Chapter 5 Pointer指针的运算指针的运算 指针是特殊类型的变量,其内容是变量的地址,因此指针的运指针是特殊类型的变量,其内容是变量的地址,因此指针的运算及结果一定要符合地址逻辑。算及结果一定要符合地址逻辑。五种算术运算五种算术运算int a,
7、 b, *p1, *p2;p1=&a;p2=&b;a2000Hb2400Hp1p22000H2400Hp1+; /*含义指向含义指向a后的整型单元后的整型单元*/2019H2019Hp1- -; /*指向指向a前的整型单元前的整型单元*/p1+n; /*指向指向a后的第后的第n个整型单元个整型单元*/p1- n; /*指向指向a前的第前的第n个整型单元个整型单元*/p2- p1; /*a和和b之间差的单元数之间差的单元数*/结果结果200Hp n 相当于相当于: p的实践内容的实践内容 nsizeof(*p);六种关系运算六种关系运算比较两个同类型变量之间的地址关系。比较两个同类型变量之间的地
8、址关系。p1p2;第五章 指 针Chapter 5 Pointer指针赋值运算#include void main(void) int a,b,*p1,*p2; a=2; b=3; p1=&a; p2=&b; *p1=*p2; printf(“%d,%dn,a,b); a=3; b=5; p1=p2; printf(“%d,%d,*p1,*p2);差别差别a&a 2000Hb&b 2400Hp1p2232000H2400H第五章 指 针Chapter 5 Pointer5.2 指针与数组指针与数组 数组是同类型的变量的集合,各元素按下标的特定顺序占据一数组是同类型的变量的集合,各元素按下标的特
9、定顺序占据一段延续的内存,各元素的地址也延续,指针对数组元素非常方便。段延续的内存,各元素的地址也延续,指针对数组元素非常方便。指针与一维数组指针与一维数组经过指针援用数组元素可以分以下三个步骤:经过指针援用数组元素可以分以下三个步骤:阐明指针和数组阐明指针和数组int *p,a10;指针指向数组指针指向数组p=a; /*指向数组的首地址指向数组的首地址*/p=&a0; /*指向数组的首地址指向数组的首地址*/经过指针援用数组元素经过指针援用数组元素当指针指向数组的首地址时,那么下标为当指针指向数组的首地址时,那么下标为i的元素地址为:的元素地址为: p+i 或或a+i援用数组元素可以有三种方
10、法:援用数组元素可以有三种方法:下标法:下标法: a i 指针法:指针法: *(p+i)数组名法:数组名法:*(a+i)留意:数组名是地址常量,不能改动!留意:数组名是地址常量,不能改动! a=p; /*Error!*/第五章 指 针Chapter 5 Pointer举例:打印数组中的奇数。举例:打印数组中的奇数。#include void main(void ) int i ,a 10 ; for (i=0 ; i10 ; i+ ) scanf ( “ %d , &ai ) ; for (i=0 ; i10 ; i+) if ( a i % 2 ) printf ( “ %d, a i );
11、 数组元素法。数组元素法。循环输入。循环输入。循环判别,满足条件输出。循环判别,满足条件输出。数组名法。数组名法。 a+i *(a+i)指针法。指针法。 ,*p ;p = a;p+*(p+i)结果能否结果能否正确?正确?p= a; *p=&a0;*留意指针在运算时的变化。留意指针在运算时的变化。第五章 指 针Chapter 5 Pointer指针与字符串字符数组指针与字符串字符数组字符串在内存中可以存储为两种方式:字符串在内存中可以存储为两种方式:字符数组字符数组字符串常量字符串常量 可以使指针指向字符数组或字符串常量,经过指针援用字符数可以使指针指向字符数组或字符串常量,经过指针援用字符数组
12、或字符串的各个字符。组或字符串的各个字符。v指针与字符数组:指针与字符数组:char *chp,str =Hello!; /*阐明字符指针和字符数阐明字符指针和字符数组组*/chp=str; /*指针指向字符数组指针指向字符数组*/putchar( *(chp+2); /*经过指针援用数组元素经过指针援用数组元素*/v指针与字符串:指针与字符串:char *strp; /*阐明字符指针阐明字符指针*/strp=“Hello!; /*指针指向字符串指针指向字符串*/puts(strp); /*经过指针援用字符串经过指针援用字符串*/阐明指针时,可以同时赋初值,如:阐明指针时,可以同时赋初值,如:
13、char *strp=“Hello!;赋值表示将字符串的地址赋给指针!赋值表示将字符串的地址赋给指针!第五章 指 针Chapter 5 Pointer举例:将字符串中的大写字母转化对应的小写字母。举例:将字符串中的大写字母转化对应的小写字母。#include void main(void) char *p,s80; p=s; gets(p); for(;*p!=0;p+) if(*p=A&*p=Z) *p+=32; p=s; puts(p); 第五章 指 针Chapter 5 Pointer将无符号的八进制字符串转换为十进制整数。将无符号的八进制字符串转换为十进制整数。#include voi
14、d main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn,n); p指向指向s数组。数组。输入字符串。输入字符串。sps5560n=0*8+5-05n=5*8+5-045n=45*8+6-0366思索题:将思索题:将4位十六进值字符串转化为十进制字符串。位十六进值字符串转化为十进制字符串。第五章 指 针Chapter 5 Pointer二维数组的地址二维数组的地址如下阐明数组如下阐明数组int a34=1,2,3,4,5,6,7,8,9,10,11,12;其二维构造如下:其二
15、维构造如下:12345 6789101112行行列列为了便于索引,为了便于索引,C言语将数组分为两级管理。言语将数组分为两级管理。a0a1a2 将将a了解为一维数组,了解为一维数组, 数组有三个元素,它们分别为数组有三个元素,它们分别为a0、a1,a2 。各个元素又是一个有四个元素的一维数组。各个元素又是一个有四个元素的一维数组。从地址的角度看:从地址的角度看:a 为为a0 第一行的首地址第一行的首地址a+1 为为a1 第二行的首地址第二行的首地址a+2 为为a2 第三行的首地址第三行的首地址a+1 地址一次加一行。地址一次加一行。i行行j列数组元素的地址可以由列数组元素的地址可以由a i +
16、j得到。得到。第五章 指 针Chapter 5 Pointer数组名地址的两级管理数组名地址的两级管理aa0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23等价地址及其管理方式等价地址及其管理方式数组名是数组的地址,而且是常量,数组名是数组的地址,而且是常量,* 运算不改动其值!运算不改动其值!以下三种地址等价:以下三种地址等价:a+i*(a+i)a i 加法按行递增加法按行递增加法按列递增加法按列递增(a+1)+1*(a+1)+1差别?差别?第五章 指 针Chapter 5 Pointer 数组名表示数组元素数组名表示数组元素a i j (*
17、(a+i) j *(*(a+i)+j)*(a i +j)指针与二维数组指针与二维数组int *p, a34;p=a;aij*(p+4*i+j)等价!等价!a00aa01a02a0a10a11a12a1a20a21a22a2a+1a1+2第五章 指 针Chapter 5 Pointer举例:举例: 在数组在数组a中查找输入的数,输出行列位置。中查找输入的数,输出行列位置。#include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d , &iS) ; for(
18、i=0;i3;i+)for(j=0;j4;j+) if(iS= a i j ) printf(“iS equal to a%d %d n,i , j); 下标法。下标法。*(a i +j)*(*(a+i)+j)*(p+4*i+j)第五章 指 针Chapter 5 Pointer5.3 指指 针针 数数 组组 指针是存放其它数据对象地址的变量。因此,指针可以构成数指针是存放其它数据对象地址的变量。因此,指针可以构成数组。每个数组元素为一个指针变量,且在内存中延续存放。组。每个数组元素为一个指针变量,且在内存中延续存放。指针数组的阐明指针数组的阐明阐明格式:阐明格式: type *数组名数组名co
19、nst exp;int *p 4 ;含义是在内存中开辟空间,并指明元素所指向的对象的类型。含义是在内存中开辟空间,并指明元素所指向的对象的类型。p 0 p 1 p 2 p 3 数组名数组名p为数组的地址。为数组的地址。运用前必需让各元素指向对象。运用前必需让各元素指向对象。int i, a34, *p3;for(i=0;i3;i+) p i =a i ;*(p2+1)=2; /*经过指针数组援用数组元素经过指针数组援用数组元素a21*/ 第五章 指 针Chapter 5 Pointer指针数组的运用举例指针数组的运用举例指针数组与多维数组指针数组与多维数组 经过指针数组按数学方式输出数组的值。
20、经过指针数组按数学方式输出数组的值。#include void main ( ) int i , j; int a34= 1,2,3,4, 5,6,7,8, 9,10,11,12 ; int *p3; p0 = a0; p1 = a1 ; p2 = a2; for (i=0 ; i3 ; i+) for (j=0; j4; j+) printf (“ %5d , *(pi+j); printf ( “n ) ; 123456789 101112 p0数组数组a的二维构造的二维构造p1p2a0a1a2每输出一行,打印回车。每输出一行,打印回车。第五章 指 针Chapter 5 Pointer指针
21、数组与多字符串指针数组与多字符串经过指针数组构成的菜单,执行经过指针数组构成的菜单,执行DOS命令。命令。#include void main(void )char *command = “dir, “time, “date, ch ; for ( ; ; ) do printf (“1: directoryn) ; printf (“2:set timen ) ; printf (“3:set daten) ; printf (“4:quitn) ; printf (nselection:) ; ch =getchar( ) ; printf (“n) ; while (ch4) ; if
22、(ch=4) break; system (commandch-1) ; 内层循环输入选项内层循环输入选项外层循环根据选项执行命令外层循环根据选项执行命令执行系统命令函数,如执行系统命令函数,如:system(“dir);dir0time0date0command0command1command23-1 2第五章 指 针Chapter 5 Pointer5.4 指向指针的指针指向指针的指针 假设指针变量的内容存放其它指针的地址,称该指针为指向指假设指针变量的内容存放其它指针的地址,称该指针为指向指针的指针。针的指针。 指向指针的指针的阐明:指向指针的指针的阐明:方式:方式: type *p;i
23、nt *p;p是一个指向整形指针的指针。是一个指向整形指针的指针。#include void main ( void) int x, *p, *q ; x=10; p=&x; q=&p; printf (“%d , * *q) ; p为指向整型的指针。为指向整型的指针。q为指向整型指针的指针。为指向整型指针的指针。xpq2000H3000H102000H3000H第五章 指 针Chapter 5 Pointer指向指针的指针的运用指向指针的指针的运用指向指针的指针普通用于多维数组和指针数组的操作。指向指针的指针普通用于多维数组和指针数组的操作。多维数组多维数组#include void main ( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12, ; int *arr3 = a0 , a1 , a2 ; int i ,j, *p ; p=arr ; for (i=0 ;i3; i+) for (j=0 ; i4 ; j+) printf(“%5d , *( *(p+i)+ j ) ) ; printf (“n) ;aiaij123456789101112a0a1a2arrarrpp+1第五章 指 针Chapter 5 Pointer用于处置多字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年临时搬运合同
- 2024年度某新能源汽车制造技术许可合同
- 2024年度文化娱乐活动策划合同
- 2024年广播剧配音委托合同
- 2024年建筑工程地面建设合同
- 企业普通员工年终个人工作总结
- 2024年度风力发电设备安装合同
- 节能宣传课件教学课件
- 2024医疗机构人力资源共享与培训合同
- 2024年度碎石料供需合同
- 护士与医生的合作与沟通
- GB 42295-2022电动自行车电气安全要求
- 产品系统设计开发 课件 第4、5章 产品系统设计类型、产品系统设计开发综合案例
- 1编译原理及实现课后题及答案
- 焊接材料的质量控制和追溯规范
- 让阅读成为习惯家长会课件
- 家庭健康照护服务方案
- 施工方案 谁编
- 沪教牛津版八上英语Unit-6-单元完整课件
- 新能源及多能互补互补技术
- 混凝土搅拌站安装及拆除方案
评论
0/150
提交评论