c语言数组与指针-指针篇.ppt
《c语言数组与指针-指针篇.ppt》由会员分享,可在线阅读,更多相关《c语言数组与指针-指针篇.ppt(57页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、指 针6.2 指针的概念指针的概念6.3 指针与数组指针与数组6.4 字符串的指针字符串的指针6.5 指针数组和指向指针的指针指针数组和指向指针的指针6.2.1 地址与指针的概念地址与指针的概念 6.2.2 指针的定义与引用指针的定义与引用 6.2 指针的概念指针的概念指针的概念指针的概念指针是变量存放地址的变量这个地址可以是变量的地址,也可以是复杂数据类型的地址,如数组,结构体等,也可以是函数的地址。指针变量存放了哪个变量的地址就称该指针指向了这个变量。内存地址内存地址1、变量与地址 程序中:int i;float k;内存中每个字节有一个编号-地址.2000200120022005内存02
2、003ik 编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象2、数组与地址 地址内存单元整型数组元素a0整型数组元素a1整型数组元素a2123300030013002300330043005数组与地址对照表 数组名 数据类型 长 度 首地址 a 整型整型 3 3000程序中:int a3=1,2,3;指针与指针变量指针与指针变量.2000200420062005整型变量i10变量i_pointer200120022003指针:一个变量的地址指针变量:专门存放变量地址的变量叫2000指针指针变量 变量的内容 变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量寻址寻址
3、访问内存单元称为寻址。直接寻址:通过变量名对内存单元进行存取。间接寻址:通过指针变量间接存取。指针变量的定义、初始化和引用指针变量的定义、初始化和引用(一一)、指针变量的定义和初始化、指针变量的定义和初始化 数据类型数据类型 *指针变量名指针变量名1=初值初值1,;指针变量的定义和初始化格式 例:指针变量的定义和初始化。int a;int*p=&a;float f1,f10,*p1=&f1,*p2=f;int*p;int*p;int *p;int*p,i;注意指针的指向编译器不识别没有明确指向的指针。但使用这样的指针可能导致错误。(二二)、指针变量的引用方式、指针变量的引用方式 1、直接引用指
4、针变量名使用格式为:指针变量表达式指针变量表达式。这个表达式必须是地址型表达式例如:int i,*p_i,*q;p_i=&i;q=p_i;需要用到地址时,可以直接引用指针变量名。例如:int i,j,*p=&i;scanf(“%d,%d”,p,&j);2、通过指针变量来引用所指向的变量使用格式为:*指针变量名。在程序中“*指针变量名”代表它所指向的变量。例如:int i=1,j=2,k,*p=&i;k=*p+j;(三三)、取地址运算符与指针运算符、取地址运算符与指针运算符 对象数对象数名称名称运算符运算符运算规则运算规则运算对象运算对象 运算结果运算结果结合性结合性 单目单目 前缀前缀取地取地
5、址址&取运算对取运算对象的地址象的地址变量或数变量或数组元素组元素对象的地对象的地址址 单目单目 前缀前缀指针指针 *取所指向取所指向的变量或的变量或数组元素数组元素指针变量、指针变量、变量或数变量或数组元素的组元素的地址地址指针变量指针变量所指向的所指向的变量或数变量或数组元素组元素自右向自右向左左 取地址运算符和指针运算符的运算对象、运算规则、结合性如表所示。&和和*优先级别优先级别&、*和自增、自减等单目运算符是同级别的 所有单目运算符的结合性均为自右向左 例如,设有变量a、指针变量pa,且pa已经指向a。*&a 正确的。相当于“*(&a)”,&a是变量a的地址,*(a地址)代 表变量a
6、。&*a 错误的。相当于“&(*a)”,因为a不是指针变量,所以*a不正确。*&pa 正确的。相当于“*(&pa)”,&pa是pa的地址,*(pa地址)代表指针变量pa。&*pa 正确的。相当于“&(*pa)”,*pa代表变量a,&(变量a)代 表a的地址。混合使用运算符混合使用运算符例:例:用指针变量按从小到大的顺序输出三个整数。main()int a,b,c,*pa=&a,*pb=&b,*pc=&c,*p;scanf(“%d,%d,%d”,pa,pb,pc);if(*pa*pb)p=pa;pa=pb;pb=p;if(*pa*pc)p=pa;pa=pc;pc=p;if(*pb*pc)p=pb
7、;pb=pc;pc=p;printf(“%d=%d=%dn”,*pa,*pb,*pc);6.3 指针与数组6.3.1 指向一维数组的指针6.3.2 指向多维数组的指针指向一维数组的指针指向一维数组的指针int a10;int*p;p=&a0;/p=a;这样指针p就指向了一维数组a 指向一维数组的指针变量的使用指向一维数组的指针变量的使用 处理数组元素的关键是引用数组元素,引用数组元素的方法与指针指向数组的方式有关:当指针变量指向数组首地址时,引用数组元素的方法如下:引用“数组元素0”*(指针变量0)或 *指针变量引用“数组元素i”*(指针变量i)1、用指针处理数组元素这里的“指针变量1”代表同
8、数组的下一个元素 当指针变量指向下标为i的数组元素时,引用数组元素的方 法如下:引用“数组元素i”*(指针变量0)或 *指针变量引用“数组元素i-k”*(指针变量-k)引用“数组元素i+k”*(指针变量k)当指针变量指向首地址后,对下标为i的数组元素引用一共 有下列四种方法:*(指针变量i)*(数组名i)指针变量i 数组名i 方法1,2引用数组元素的方法使用了“指针运算符”,称为“指针法”;方法3,4引用数组元素的方法使用了“下标运算符()”称为“下标法下标法”。注意:注意:指针变量是存放地址这种数据类型的变量,可以按照变量的处理方式对其进行运算;而数组名仅仅是一个地址常量,只能按照常量的方式
9、进行处理。2、指向一维数组的指针变量的运算 当指针变量已指向数组后,对指针变量可以进行算术和关系运算。(1)指针变量和整数的算术运算。对指针变量进行算术运算的规则如下:指针变量整数 “指针变量中的地址整数*指针变量类型占 用单元数”对应的地址指针变量整数 “指针变量中的地址整数*指针变量类型占 用单元数”对应的地址指针变量 “指针变量中的地址指针变量类型占用单元 数”对应的地址,此后,指针变量将指向下一 个数组元素。指针变量 “指针变量中的地址指针变量类型占用单元 数”对应的地址,此后,指针变量将指向上一 个数组元素。指针变量 “指针变量中的地址”对应的地址(因为是后缀 减1运算符),此后,指
10、针变量将指向上一个 数组元素。指针变量 “指针变量中的地址”对应的地址(因为是后缀 增1运算符),此后,指针变量将指向下一个 数组元素。上述运算规则组成的式子称为表达式表达式,这种表达式的类型是“地址型”,所以上述规则组成的表达式常称为“地址型表达式”或“指针型表达式”,简称为“指针表达式”。例如:设定义了整型数组a10,整型指针变量pa,且执行了pa=a。假定数组a的首地址为2000。请看下列的表达式及其运算结果:执行papa5后 pa指向数组元素a5,pa的地址值将为 20005*22010,其中的“2”是整型数据 占用的单元数;再执行pa后 pa将指向数组元素a4,pa的地址值将为 20
11、101*22008。注意:注意:对代表地址常量的数组名不能进行增1减1的算术运算,+a、a+、-a、a-、a=a+5、a=a-5都是错误的。(其中a为数组名)(2)指针变量和指针变量的减法运算指针变量和指针变量的减法运算规则如下:指针变量指针变量1指针变量指针变量2 要求这两个指针变量必须指向同一个数组,否则不能进行减法运算。运算 结果为它们所指向的数组元素下标相差的整数。例如,定义了数组a和同类型的指针变量p1、p2。其中p1指向数组元素a2;p2指向数组元素a6。p1p2 结果为整数4p2p1 结果为整数4 当两个指针变量的值(地址值)满足关系运算时,结果为1(真)否则结果为0(假)。例如
12、,定义了数组a和同类型的指针变量p1、p2;使p1指向数组元素a2;p2指向数组元素a3。下列关系表达式及其运算结果:p1p2 结果为1(真)。p1p2 结果为0(假),注意是后缀。p2p1 结果为1(真),注意是前缀。p1a 结果为0(假),a是地址常量。p1&a9 结果为1(真),&a9是地址常量。p2=a3 结果为1(真),a3是地址型表达式,代表a3的地址。(3)指针变量的关系运算。对指针变量进行关系运算对规则如下:指针变量指针变量1 关系运算符关系运算符 指针变量指针变量2例:输入10个整数存入一维数组,从中查找某个整数(该数从键盘上读取),查到则输出其是第几个数,查不到则输出“No
13、t Find!”。要求用指针法处理。程序清单如下:main()int a10,*p=a,x,n,flag=0;for(;pa+10;p+)scanf(“%d”,p);scanf(“%d”,&x);for(n=1,p=a;pa+10;p+,n+)if(*p=x)flag=1;break;if(!flag)printf(“Not Find!n”);else printf(“%dn”,n);3、关于使用“指针法”处理一维数组元素的下标越界问题 C语言对用“指针法”引用数组元素时,对下标是否越界也不作检查,即允许下标越界。例如,定义了整型数组a10,并使同类型的指针变量p指向了数组a的首地址的首地址。
14、则下列对a数组的元素引用都是允许的:*(p-1)代表数组元素a0前面2个单元中存放的数据 (看成整数)*(p+10)代表数组元素a9后面2个单元中存放的数据 (看成整数)虽然C语言允许处理数组元素时下标可以越界,但在程序中要尽量避免。当出现下标越界的情况,如果你使用的是数组元素值,显然这个值不知为何值;如果你是将某个值存入该数组元素,结果将会破坏对应内存单元中原来的值,使得后面程序运行时,结果不正确,甚至出现预料不到的问题,而这样的错误很难查找。指向二维数组的指针变量的使用指向二维数组的指针变量的使用 1、指针变量指向二维数组的某个元素 当指针变量指向二维数组的某个元素时,利用指针变量来处理该
15、数组元素和处理一维数组元素的方法相同。(1)让指针变量指向二维数组的某个元素的方法。用初始化方式的格式为:类型*指针变量&数组名下标1下标2 用赋值方式的格式为:指针变量&数组名下标1下标2(2)二维数组元素的引用方法。当指针变量已指向二维数组元素后,引用该数组元素的方法 是:*指针变量例1:输入2行3列的矩阵元素后,存入二维数组。再按行列格式输出。main()int a23,*p;int i,j;for(i=0;i2;i+)for(j=0;j3;j+)p=&aij;scanf(“%d”,p);for(i=0;i2;i+)printf(“n”);for(j=0;j3;j+)p=&aij;pri
16、ntf(“%10d”,*p);程序如下:2、指针变量指向二维数组的首地址 当指针变量指向二维数组的首地址时,也可以处理数组中的任何一个元素。(1)让指针变量指向二维数组首地址的方法。使用初始化或赋值方式都可以使指针变量指向二维数组的首地址。使用初始化方式有两种:类型类型*指针变量二维数组名指针变量二维数组名0类型类型*指针变量指针变量&二维数组名二维数组名00使用赋值方式有两种:指针变量二维数组名指针变量二维数组名0指针变量指针变量&二维数组名二维数组名00(2)二维数组元素的引用方法。当指针变量已指向二维数组的首地址后,引用该数组第i行第j列的元素的方法是:*(指针变量(指针变量i*列数列数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 数组 指针
限制150内