首页 第8章 指针

第8章 指针

举报
开通vip

第8章 指针null 引入问题: 引入问题: A、B、C欲入住某旅馆的房间。A先到达了旅馆,在服务台登记了房间,房号是5818。然后A电话通知了B,但没有通知C。 B和C该怎样找到A呢? B可以直接到5818找到A。 C可以能从旅馆的服务台查询A的房号5818,找到A。第8章 指针第8章 指针 内容提要 ◆ 指针的概念 ◆ 指针的定义及应用 ◆ 指针与数组 ◆ 针与字符串 ...

第8章 指针
null 引入问题: 引入问题: A、B、C欲入住某旅馆的房间。A先到达了旅馆,在服务台登记了房间,房号是5818。然后A电话通知了B,但没有通知C。 B和C该怎样找到A呢? B可以直接到5818找到A。 C可以能从旅馆的服务台查询A的房号5818,找到A。第8章 指针第8章 指针 内容提要 ◆ 指针的概念 ◆ 指针的定义及应用 ◆ 指针与数组 ◆ 针与字符串 ◆ 指向函数的指针§8.1 指针的概念一、变量的地址 数据存放在内存中。内存单元采用线性地址编码。 1、变量地址:系统为变量分配的内存单元的地址。 一个无符号整型数 int a; float b; a=3; b=5; 2、变量的有关概念 存储内容:数据值 空间大小:数据类型 空间位置:地址 §8.1 指针的概念null二、变量的访问方式 1、直接访问 2、间接访问 定义一个变量p,存放a的地址,通过访问p访问a 若将变量p的值改为3AB8(b的地址),则可通过p 访问b。 int a; float b; a=3; b=5; 如何定义p? 如何获得变量a的地址? 如何通过p访问a?null三、指针变量 指针变量是存放地址的变量。 如:p为指针变量,它存放整型变量a的首地址 我们称,指针变量p指向整型变量a§ 8.2 指针变量的定义与应用一、定义方法 类型符 *指针变量 指针变量的类型 —指向的内存单元中 存放的数据的类型。如: int *p1,*p2; char *ps; float *pf1,*pf2;§ 8.2 指针变量的定义与应用null二、指针变量赋值 指针变量的值为地址,是个无符号整数,但不能直接将整形常量赋给指针变量。 用变量地址给指针变量赋值(求地址运算符) 注 :变量的类型必须与指针变量的类型相同。 用相同类型的指针变量赋值 注:若不赋值,则指针变量的值是随机的。 赋空值NULL 指针变量初始化的方法: 赋 空值NULL 用已定义的变量地址 如: int a,b, *p; p=&a;如: int a ; int *p1,*p2; p1=&a; p2=p1;如:p=NULL; 或:p=0;null三、指针变量的应用 1.两个有关的运算符: *、& 形式:& 任意变量 /*取地址运算符*/ * 指针变量 /*指针运算符*/ 含义:&a表示变量a所占据的 内存空间的首地址; *p表示指针变量p所指向的内存中的数据; 应用:通过指针变量访问所指变量 ①将指针变量指向所访问的变量 如:int a=5,*p,b; p=&a; ②访问所指变量 取内容:b=*p; printf(“%d\n”,*p); 存内容:*p=100; null注意:*p若出现在“=”的右边或其它表达式中则为取内容。 *p若出现在“=”的左边则为存内容。例 8-1:读程序,写结果 void main( ) { int a=5,b=3; int *p; p=&a; b=*p+5; printf(“%d\n”,b); *p=4; printf(“%d,%d\n”,a,*p); }null2.运算规则 *、&:优先级相同,且右结合 与++、--、!等单目运算符的优先级相同。 高于算术运算符*、/、% int a=2,*p=&a,*q=&a; printf(“%d %d\n”,*(p++),*(q++)); p=&a;q=&a; printf(“%d %d\n”,*p,(*q)++);结果是:2 2 3 2null21001pa10011001qnull思考:下列表达式是何含义? &*p *&a null相当于: c=((*pa)++)+*pb2 3 a=2,b=3 c=5 c=5 c=6 c=6 c=7 a=4,b=4null例8-2:交换两个数a、b的值null 四、指针变量作函数参数 例8-3: 编写一个函数实现两个数的交换void swap (int *x,int *y) { int *t; t=x;x=y;y=t; } void swap (int *x,int *y) { int *t; *t=*x;*x=*y;*y=*t; } § 8.3 指针和数组一、一维数组和指针 1、数组是连续存放的若干个元素的集合 2、数组名就是指向此数组第一个元素的指针(首地址) 如:int a[10],*p; p=a; 等价于 p=&a[0]; 3、某一元素的地址:p=&a[i] 用指针引用该元素:*p a[i]§ 8.3 指针和数组null4、数组元素的下标在内部实现时,统一按“基地址+位移”的方式处理。即:a a+1 a+i 故表示数组元素的地址可以用:p+i、a+i 表示数组元素的内容可以用:a[i]、*(p+i)、*(a+i) 数组名a(数组的指针)与指向数组首地址的指针变量不同,a不是变量。 null 例8-4:读以下程序:null 5、数组指针、指针变量与数组元素之间的关系: 设有 int a[10],*p=a; 则地址关系内容关系null例8-5 数组的使用scanf(“%d”,a+i);scanf(“%d”,p+i);printf(“%d”,*(a+i));null二、指针的运算 1、赋值运算 如:p=&x p=a p=NULL 注:指针类型相同 2、加减运算 用法:指针±整数 如:a+i p±i 注:只能用于数组元素的引用,注意下标的有效范围。 3、 指针相减运算:求两地址的间距 用法:指针-指针 如:p-a 注:两个指针的类型相同,并指向同一连续的存储区域。null4、移动指针(++、--): 如:p++、pa-- 注:对数组名不能使用该运算 5、比较运算: 用法:指针 运算符 指针 如: pmax则 Max=*(p+i)且k=imax=a[8]=96null例8-8 编一函数将一维数组的元素倒置存放。 已知:一维数组,元素个数。 结果:倒置后的一维数组。 函数定义: void inverse(int a[],int n) void inverse(int*p,int n) 算法: 1、令p指向数组的开始,q指向结束; 2、交换两单元的内容; 3、两指针向中间靠拢; 4、重复上述2、3,直到p≧q1 3 5 7 9 9 7 5 3 1null例8-9 求某班某门课的平均成绩统计超过平均值的人数(求用指针操作数组)。 分析: 1、令p指向score(存放成绩的数组) 的开始。 2、通过移动指针求和(重复N次) 3、求平均值 4、令p重新指向score的开始 5、不移动指针但通过指针判断各 单元的内容是否大于平均值, 并计数。§ 8.4 指针与字符串一、字符串的指针 C语言的字符串是以‘\0’作结束符的字符序列,用字符数组存放。字符串指针就是字符数组的首地址 如:char a[]=“Apple”; char b[ ]={‘C’,‘h’,‘i’,‘n’,‘a’,‘\0’}; 二、字符串指针变量 定义:char *指针变量 注意:p指向字符串的首地址,不是存放字符串。如:char *p,*q=“Language”; p=“This is a book.”;如:char *p,c[10]; p=c;§ 8.4 指针与字符串null例8-10 逆序打印字符串。 算法: 设字符串为q; 令p指向串尾; 打印字符*p,并将p前移;直到p指向串首。null例8-11 写一函数判断一个字符串是否回文 (顺读与逆读相同)。 已知:字符串指针变量p(作参数) 结果:是(1)或否(0)(返回值) 算法:1.令q指向最后一个字符 2.若*p=*q,则两指针向里靠拢,直到p>=q,则return 1 否则retrun 0。null三、字符数组与字符指针变量的比较 char a[]=“I love this game”; char *p=“I love this game”; 1、存储的内容不同; 字符数组可以存字符串,存的是字符; 字符指针变量存的是字符串在内存的 首地址。 2、赋值的方式不同: 字符数组只能对各个元素赋值; (一次只赋一个字符,要赋若干次) 字符指针变量只赋一次,赋的是地址 3、当没有赋值时: 字符数组代表了一个确切的地址; 字符指针变量中的地址是不确定的。如: char a[10],*p; p=“China”; a=“Hello”;20如: char a[10],*p; scanf(“%s”,a); scanf(“%s”,p);null4、字符数组名不是变量,不能改变值; 字符指针变量可以改变值。 5、可以向数组那样用下标形式引用 指针变量所指字符串中的字符。 6、字符串指针变量的应用: 例如,可以用一个指针变量指向一个 格式字符串,在printf中直接使用此 指针变量。 如:char *fmt=“a=%d,b=%d,c=%d\n”; 则:printf(fmt,a,b,c); 等价于 printf(“a=%d,b=%d,c=%d\n”,a,b,c);如:a++; p++;如: char *p=“abcd”; putchar(p[3]); p[2]=‘x’;null7、注意使用的区别§ 8.5 指向函数的指针定义:一个函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。 说明: 1、指向函数的指针的一般形式为: 数据类型 (*指针变量名) (函数参数列表); 2、函数调用可以通过函数名调用,也可以 通过函数指针调用。 3、“int(*p)(int,int);”表示定义一个指向函数 的指针变量p。在程序中把哪一个函数赋 的地址赋给它,它就指向哪个函数。 #include “stdio” void main( ) { int max(int,int); int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b) printf(“Max is%d\n”,c0); } int max(int x,int y) { int z; z=(x>y)?x:y; return(z); } #include “stdio” void main( ) { int max(int,int); int(*p)(int,int) int a,b,c; p=max; scanf(“%d%d”,&a,&b); c=(*p)(a,b) printf(“Max is%d\n”,c0); }§ 8.5 指向函数的指针null4、在给函数指针赋值时,只需给出函数名 而不必给出参数。如:p=max; 5、用函数指针变量调用函数时,只需用(*p)代替函数名即可,在(*p)之后的括号中根据需要写上实参。例如: c=(*p)(a,b); 6、对指向函数的指针变量,自加、自减运算是无意义的。
本文档为【第8章 指针】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_456213
暂无简介~
格式:ppt
大小:2MB
软件:PowerPoint
页数:0
分类:工学
上传时间:2011-04-08
浏览量:9