




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,指 针,夏涛,5.3 指针的运算,(3)指针相减运算 假设指针px和py是指向同一组数据类型相同的数据,则px-py的运算结果是两个指针间数据的个数。所以px和py之差并不是px和py两指针内所包含地址量之差,而是由如下公式计算决定: px-py=(px)-(py)/sizeof(指针的目标变量的数据类型),例: 如果 px和py是指针变量 px=2048 py=1024 px和py的目标变量的数据类型为double, 则 px-py=(px)-(py)/sizeof(double) =(2048-1024)/8 =128 即px和py之间有128个double类型的数。,5.3 指针的运算,5.3.2 指针的关系运算 两个指向同一组相同类型数据的指针之间可以进行各种关系运算。两个指针之间的关系运算表示它们的目标变量的地址位置之间的关系。 指针的关系运算应注意以下几点: 两个不同数据类型的指针之间的关系运算是无意义的。 指针与一般整数之间的关系运算也是无意义的。 指针可以和0进行“= =”或“!=”比较,用以判断其是否为空指针。,关系运算符有: 小于 等于 = = 大于等于 = 小于等于 = 不等于 ! =,5.3 指针的运算,例: int *px,*py; pxpy px= =py px=py px=py px!=py,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之前。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之后。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置相同。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之后或相同。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之前或相同。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置不同。,5.3 指针的运算,5.3.3 指针的赋值运算 对指针可以进行赋值运算,所赋的值一定是地址量,一般不能是数据。 赋值形式有以下几种: 可以把一个变量的地址赋给与其具有相同数据类型的指针。 例: int x,*px; px=,5.3 指针的运算,其他常用的赋值运算 设px和py是具有相同数据类型的两个指针,则以下赋值是合法的。 px=py+n; px=py-n; px+=n; px-=n; n是地址量。 对指针的目标变量的赋值 对指针的目标变量所赋的值一定是数据。要注意数据类型的统一。 例:int x,*p,y; p= 最后y=5,返回主菜单,5.4.1 指向数组的指针 5.4.2 指向数组的指针的应用,5.4 指针与数组,5.4 指针与数组,返回主菜单,5.4 指针与数组,5.4.1 指向数组的指针 数组名就是数组元素的首地址,数组元素是连续存放在一片内存空间中, C语言可以用指针访问数组的元素。用指针访问数组的元素的作法是,根据前面所述的数组、指针的概念,首先定义一个数组和指针并使指针指向该数组,例如: float x10,*px; px=x; px= 下标法(用下标符): 引用数组某元素的方法是: ai。 例如:a0,a1a9。 地址法: 引用数组某元素的方法是: *(a+i)。例如: *(a+0), *(a+1), *(a+9)。 指针法(用指针运算符): 引用数组某元素的另一种方法是:*(pa+i)。例: *(pa+0), *(pa+1), *(pa+9). 用指针加下标的方法引用数组某元素:pai。例如:pa0, pa1, pa9。,5.4 指针与数组,说明: 1、虽然上述的三种方法都能输出同样的结果,但它们的效率是不同的。 用下标法访问数组时,是转换成地址法处理的,即先计算出数组元素的地址,然后再找到它指向的存储单元,读出或写入它的值。而用指针变量指向数组元素时则不必每次计算数组元素地址。 2、使用指针访问数组元素时,完全根据地址来访问,而不作“下标是否越界”的检查。 3、使用指向数组元素的指针变量时,应当注意指针变量的当前值。例如: int a5; p = a; for(i=0; i5; i+) scanf(“%d”, p+);,5.4 指针与数组,int a10,*p; p=a;,2000 2002 2004 2006 2008 2010 2012 2014 2016 2018,&a0 &a1 &a2 &a3 &a4 &a5 &a6 &a7 &a8 &a9,a+0 a+1 a+2 a+3 a+4 a+5 a+6 a+7 a+8 a+9,p+0 p+1 p+2 p+3 p+4 p+5 p+6 p+7 p+8 p+9,a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,p0 p1 p2 p3 p4 p5 p6 p7 p8 p9,*(a+0) *(a+1) *(a+2) *(a+3) *(a+4) *(a+5) *(a+6) *(a+7) *(a+8) *(a+9),*(p+0) *(p+1) *(p+2) *(p+3) *(p+4) *(p+5) *(p+6) *(p+7) *(p+8) *(p+9),p+i a+I &ai 地址 内存 ai pi *(a+i) *(p+i),a,5.4 指针与数组,指针和数组在使用时应注意以下几点: 用指针名和数组名在访问地址中的数据时,它们的表达形式是等价的,因为指针名和数组名都是地址量。 例如: int x10,*px=x,i; 引用数组x10中的某个元素,可以这样作: xi、pxi 、*(x+i) 、*(px+i)它们的作用是等效的。 指针名和数组名在本质上是不同的。 指针是地址变量,其值可以发生变化,可以对其进行赋值和其它的运算。指针的以下运算是合法的: int x10,*px,n; px=x; px+; px - -; px+=n;,5.4 指针与数组,数组名是地址常量,不能对其进行赋值和其它运算。 下面的操作是非法的: int x10,b=2; x+; x - -; x=b; 指针在使用前必须赋初值,而数组名不需要赋初值。,5.4.2 二维数组的指针表示方法 一个二维数组可以认为由若干个一维数组所组成,其中每一个一维数组包含若干个元素。 例: int a33; a 是二维数组,共有9个元素 (3 3=9),它们是: a00, a01, a02, a10, a11, a12。 a20, a21, a22。 其全部元素数值均为 int 型。,5.4 指针与数组,分析二维数组名a和a0、a1、a2的关系 数组名a就是数组的起始地址。a+1是在a的基础上加上一行的字节数。 一个二维数组可以认为由若干个一维数组组成。对数组名a而言,它的每一个“元素”是一行而不是一个基本元素,因此a0、a1、a2只是一个地址。它们代表的是每一行起始元素的地址,也就是每行的第一列元素的地址。,5.4 指针与数组,a+0,二维数组的地址有行地址和列地址的区别,那么如果设指针变量,也应该确定是指向行还是指向列,二者不能混淆。,#include “stdio.h” main() static int a35 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15; printf(“%d, %d, %dn“, a, a+1, a+2); printf(“%d, %d, %d, %dn“, *a, *a+1, *a+2, *a+3); printf(“%d, %d, %d, %dn“, *(a+1), *(a+1)+1, *(a+1)+2, *(a+1)+3); printf(“%d, %d, %d, %dn“, *(a+2), *(a+2)+1, *(a+2)+2, *(a+2)+3); printf(“%d, %d, %dn“, ,运行程序,404, 414, 424 (第0,1,2行的行地址) 404,406,408,410 (第0行的4个元素的地址) 414,416,418,420 (第1行的4个元素的地址) 424,426,428,430 (第2行的4个元素的地址) 404,414,424 (第0,1,2行的行地址) 404,406,408,410 (第0行的4个元素的地址) 404,406,408,410 (第0行的4个元素的地址) 404,414,424 (第0,1,2行的行地址) 8,8,8 (第1行第2列元素的值),12-3,例:5-7(此例中没有应用指针变量) 把数组x 的数据复制给数组y 。,main( ) int x5=1,2,3,4,5; int y5,i; printf(“nx5=“); for(i=0;i5;i+) printf(“%3d“,*(x+i); for(i=0;i5;i+) yi= xi; printf(“ny5=“); for(i=0;i5;i+) printf(“%3d“,*(y+i); ,运行程序,x5=1 2 3 4 5 y5=1 2 3 4 5,main( ) int y5, x5=1,2,3,4,5; int *px=x,*py=y,i; printf(“nx5=“); for(i=0;i5;i+) printf(“%3d“,*(px+i); for(i=0;i5;i+) = ; printf(“ny5=“); for(i=0;i5;i+) printf(“%3d“,*(py+i); ,例:5-8(此例中应用了指针变量),*(py+i)=*(px+i),12-7,5.5.1 字符串指针 5.5.2 字符串指针的应用,5.5 字符指针和字符串,5.5 字符指针和字符串,返回主菜单,5.5 字符指针和字符串,5.5 字符指针和字符串 类型为char的指针称为字符指针。字符指针是C语言中常用的指针类型, 几乎所有字符串操作都是通过字符指针来实现的。一般情况下,字符指针 都是指向字符串,所以字符指针也称为字符串指针。 5.5.1 字符串指针 (1)字符串指针。 字符串指针是指指向字符串的指针。 例如: char str20,*ps; ps=str; (2)在指针定义的同时进行初始化 例如:char str20=“program”; char *ps=str; char *p=“string”; 用一个字符串常量给字符串指针初始化。 char *pp=p; 用一个已初始化的指针来初始化另一个指针。 字符指针的初始化就是将字符串的首地址赋给指针,这类似于数组的指针的初始化,不是将字符串本身复制到指针中。字符串指针初始化就是使指针指向该字符串。,5.5 字符指针和字符串,(3)用赋值语句给字符串指针赋值 例如:char *s; s=“string”; 把字符串string的首地址赋给指针变量s。 在实际编程中,常用字符指针来处理字符串。因此,要熟练掌握字符串指针。 (4)字符串的输出 字符串的输出有两种方法: 用字符数组名直接输出字符串 例如:main( ) static char string =“I love China!”; printf(“%sn”,string); 对于数值型数组,不能企图用数组名、数组指针直接输出其全部元素。 用字符指针变量直接输出字符串 例如: main( ) char *string=“I love China!”; printf(“%sn”,string); ,例:5-11 将字符串a中的数据复制到字符串b中。,main( ) char a =“University“,b50; int i; for(i=0;ai)!=0;i+) bi=ai; bi = 0; printf(”string a is %sn“,a); printf(”string b is %sn“,b); printf(“string b is ”); for(i=0;bi!=0;i+) printf(“%cn“,bi); printf(“n”); ,运行程序,string a is University string b is University string b is University,main( ) char a =“University“,b50; int i; for(i=0; !=0;i+) = ; = 0; printf(”string a is %sn“,a); printf(”string b is %sn“,b); printf(“string b is ”); for(i=0;bi!=0;i+) printf(“%cn“,bi); printf(“n”); ,:*(a+i) :*(b+i) :*(a+i) :*(b+i),5.5.2 字符串指针的应用,main( ) char a =“University“,b30; char *pa=a,*pb=b; int i; for(i=0; !=0;i+) = ; =0; printf(“String a is %s.n“,a); printf(“String b is %s.n“,b); printf(“String a is %s.n“,pa); printf(“String b is %s.n“,pb); printf(“String b is “); for(i=0;*(pb+i)!=0;i+) printf(“%c“,*(pb+i); printf(“.n“); ,运行程序,String a is University. String b is University. String a is University. String b is University. String b is University.,例:5-10,:*(pa+i) :*(pb+i) :*(pa+i) :*(pb+i),例:5-12 求字符串长度并输出该字符串。,main( ) int len=0; char *st=”the expense of string“; while(*st+)!=0) len+; st-=len+1; printf(“nlength=%d .string: %s“,len,st); ,运行程序,length=21. string: the expense of string,例:5-13 读程序,写出输出结果。,main( ) char *a=“I love China!“; printf(“n%s“,a+7); ,运行程序,China!,main( ) char *a=“I love China!“; a+=7; printf(“n%s“,a); ,注意: a=7 不能用常量给指针赋值。,例:5-14 字符串复制。,运行程序,main( ) int i=0; char s20,buf20; char *ps=s,*pb=buf; printf(“nEnter string:“); scanf(“%s“,pb); while(*ps+=*pb+)!=0) i+; printf(“n%s copy %s“,s,ps-i-1); ,等效为: while(*(ps+i)=*(pb+i)!=0) i+;,Enter string: abcdefg abcdefg copy abcdefg,返回主菜单,5.6.1 指针数组的概念 5.6.2 指针数组的应用,5.6 指针数组,5.6 指针数组,返回主菜单,5.6 指针数组,5.6 指针数组 5.6.1 指针数组的概念 指针数组是一个数组,该数组是指针变量的集合,即它的每一个元素都是一个指针变量,这些指针变量具有相同的数据类型. 指针数组的定义形式: 数据存储类型 数据类型 *数组名数组长度说明; 指针数组同其他数组一样,按数组下标的次序被存放在一片连续的存储空间,数组名是其所占区域的首地址.指针数组在使用前必须先定义. 例如: int *p3; 数组p包含三个指针元素它们是:p0,p1,p2.它们都是int类型的指针. 例如: char *pc5; 数组pc包含五个指针元素即:pc0,pc1,pc2,pc3,pc4.它们都是char类型的指针. 指针数组的一个应用方面就是一次定义一组指针(一般这些指针都有着一定的相互关联,特别是指针之间编排次序上相互关联),5.6 指针数组,指针数组主要用于字符串的操作。 用二维字符数组定义若干个字符串时,如果有一个字符串比较长,则要求列数按此长度定义,这样就会浪费许多内存单元。 用二维字符数组和用指针数组初始化时,在内存中的情况是不同的。用二维数组时每行的长度是相同的;而用指针数组时,并未定义行的长度,只是分别在内存中存储了长度不同的字符串,然后用指针中的元素(是指针型数据)分别指向它们。在内存中没有浪费存储单元。用指针数组处理字符串可以节省内存,而且提高运算效率。例如:想对5个姓名排序,若将字符串交换位置速度慢,而交换指针则速度快得多。,char name512,char *name5,*(a0+0) *(a0+1) *(a0+2) *(a0+3) *(a0+4) *(a1+0) *(a1+1) *(a1+2) *(a1+3) *(a1+4),*(pa0+0) *(pa0+1) *(pa0+2) *(pa0+3) *(pa0+4) *(pa1+0) *(pa1+1) *(pa1+2) *(pa1+3) *(pa1+4),a0+0 a0+1 a0+2 a0+3 a0+4 a1+0 a1+1 a1+2 a1+3 a1+4,pa0+0 pa0+0 pa0+0 pa0+0 pa0+0 pa0+0 pa0+0 pa0+0 pa0+0 pa0+0,a00 a01 a02 a03 a04 a10 a11 a12 a13 a14,pa00 pa01 pa02 pa03 pa04 pa10 pa11 pa12 pa13 pa14,pai+j ai+j 内存 aij paij *(ai+j) *(pai+j),int *pa2,int a25,例:5-15 输入星期的数码,输出对应的星期英文名。,main( ) static char *weekname =“ “,“Monday“,“Tuesday“,“Wednesday“, “Thursday“,“Friday“,“Saturday“,“Sunday“; int week; while(1) printf(“n Enter week No:“); scanf(“%d“, ,定义了8个指针, weekname0指向空字符 weekname1指向字符串Monday weekname2指向字符串Tuesday . weekname7指向字符串Sunday,12-8,12-9,a,例:多个字符串按递增方式排序。,运行程序,#include “stdio.h“ main( ) static char *monthname =“illegal month“,“J
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 想和做的课件
- 2026届山东省临沂市临沭县一中高一化学第一学期期末学业水平测试模拟试题含解析
- 幼儿园幼儿户外活动方案
- 2026届江西省上饶县二中化学高三上期末达标检测模拟试题含解析
- 大学组织联谊活动策划方案
- 隐形正畸面试题及答案
- 中建五局考试试题及答案
- 常量池面试题及答案
- 家电公司合同审核管理规定
- 温医护理考试试题及答案
- 订单交期管理制度流程
- (DB45T 2149-2020)《公路边坡工程技术规范》
- 金笔作文四级第4课省公开课获奖课件市赛课比赛一等奖课件
- 牧场物语-矿石镇的伙伴们-完全攻略
- DB3305-T 227-2022“两山银行”建设与运行管理指南
- 食品经营安全管理制度目录
- 《不孕症》教案课件
- 【家庭教育对幼儿性格形成的影响探究11000字(论文)】
- 《电化学原理与应用》课程教学大纲
- 幼小衔接数学试卷每日一练可打印(17套)
- 漫画行业分析报告
评论
0/150
提交评论