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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。