c语言指针讲义

上传人:aa****6 文档编号:54833144 上传时间:2018-09-20 格式:PPT 页数:81 大小:1,007KB
返回 下载 相关 举报
c语言指针讲义_第1页
第1页 / 共81页
c语言指针讲义_第2页
第2页 / 共81页
c语言指针讲义_第3页
第3页 / 共81页
c语言指针讲义_第4页
第4页 / 共81页
c语言指针讲义_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《c语言指针讲义》由会员分享,可在线阅读,更多相关《c语言指针讲义(81页珍藏版)》请在金锄头文库上搜索。

1、第9章 指 针,特 点,能直接对内存地址操作, 使用灵活,实现动态存储管理,可以使程序简洁、紧凑、高效,用间接访问的方式改变数据的逻辑顺序,调用函数时可实现变量的引用传递,地址和指针的概念,变量的地址和变量的值,int i=3; float j=6; double k=9;,3,6.0,9.0,变量i,变量j,变量k,2200,2206,2202,2214,程序中定义的变量, 系统根据它的 类型给它分配一定长度的内存单元, 该内存单元的起始地址即为变量的地址。,该内存单元的内容就是变量的值。,直接访问和间接访问,直接访问:,用变量名直接从它对应的地址存取内容。,如: int x=5,y=8,z

2、=0;z =x+y;,13,直接从 x 和 y 对应的地址2200和2202 取出内容5和8然后相加将结果13存入 变量 z 对应的地址2204的单元中。,间接访问,定义一个存放地址的变量p(p的地址1500), 将x的地址 2200存放在变量 p 中。通过 变量p取出地址2200, 再按此 地址存取其中的内容, 就间接 的完成了对x的存取。,当p的内容改为2202时, 通过 变量p取出地址2202, 再按此 地址, 存取的就是变量y的内 容。,p就是指针变量,5,8,0,变量x,变量y,变量z,2200,2202,2204,2202,指针变量的定义,一般形式:,基类型名 *指针变量名,说明:

3、,基类型名: 指针变量所指向的变量的类型名称,指针变量名: 所定义的指针变量的名称,*: 表示它后面的变量名是指针类型,功能:,(1)定义该指针变量名为指向基类型的指针变量,为 该变量分配存储单元, 其长度等于存储地址的字节数。,(2) 基类型确定用指针变量“间接”存取数据的存储单 元个数和存储形式。该变量只能指向基类型数据。,指针变量的初始化,用 =&变量名 来给指针变量赋初值。选项中的变量名必须 是已定义过的,其类型必须与基类型一致。表示将它对应的地 址值赋给所定义的指针变量。,例如: int x,p=,int x,*p=,int x; float *p=,可以用赋值语句给指针变量赋值:,

4、float y, *py; py=,指针变量的引用,引用指针变量的指针值与引用其它 类型的变量一样直接用它的变量名,引用指针变量所指向的变量时, 用“*指针变量名”,注意: 指针变量的值与它所指向变量的值之间的差别,指针变量只有正确赋值后才能通过它访问指向的变量。,int x;,p=,int *p;,*p,*p=5;,5,指针变量的运算,1. &: 取地址运算符, 取右边变量的地址,2. * : 指向运算符(间接访问运算符),访问指针变量右边所指向的变量。,&a是变量a的地址,*p 是指针变量p指向的变量。,说明: “&”和“*”都是单目运算符, 它们的优先级相同, 按自右而左方向结合。,如果

5、已定义float a, *p=,则 *p,是变量 a,&*p,是变量a的地址 p,&*p,等价于 p,而 &a,是变量a的地址 p,*&a,是p所指向的变量 a,*&a,等价于a,注意,(1). 指针变量定义和引用指向变量的“*”含义有差别。,(2).不能引用没有赋值的指针变量,不要误认为p定义后变量*p就已存在,必须给p正确赋值后,变量*p才存在。,(3).p= 是给p指向的变量赋值。两者含义完全不同。,(4).给指针变量赋值必须用同类型的指针。,(5).指针变量只存放地址, 地址值是无符号整数, 但不能直接用整型量(或其它非地址量)赋值给指针变量。,int *p1=2200;,给变量赋值的

6、两种方法,1. 直接访问用变量名,如: int i; i=5;,2. 间接访问通过指向变量i的地址的指针变量 p 赋值,如:int i, *p; p=,取地址运算符&和指向运算符*的应用,main( ) int m, n;int *p= ,运行结果: Input m,n: 123 456 m=123 &m=FFD6 *p=123 p=FFD6 n=456 &n=FFD8 *q=456 q= FFD8,printf(“min=%d, max=%dn“,*p1,*p2); ,main( ),运行结果: min=6, max=8,例:通过交换指针变量值按大小顺序输出,指针变量作为函数的参数,以指针类

7、型为函数的参数,作用是将变量的地址传入函数。,int x,y; int *pt1;*pt2;,x=8;y=6;,pt1=,if (xy) swap(pt1,pt2);,printf(“x=%d, y=%dn“,x,y);,swap(int *p1,int *p2),p=*p1;,*p1=*p2;,*p2=p;, int p;,8, main() ,6,8,运行结果:x=6, y=8,int x,y; int *pt1;*pt2;,x=8;y=6;,pt1=,if (xy) swap(pt1,pt2);,swap(int *p1,int *p2),p=*p1;,*p1=*p2;,*p2=p;,

8、int p;,printf(“x=%d, y=%dn“,x,y);,指针与数组,C语言中规定数组名是指针类型的符号常量, 该符号常量值等于数组首元素的地址 ( 简称数 组首地址) ,它的类型是指向数组元素的指针类型。 即数组名是指向该数组首元素的指针常量。,指向数组元素的指针,1.定义指向数组元素的指针变量,定义指向数组元素的指针变量与定义指向变量的指针变量的 方法相同.如:,int a10; int *p; p=,由于数组名是指向0号元素的指针类型符号常量, 所以a与&a0相等。,p= 两句等价,p=a不是把a的各元素赋给p,注意数组名与指针变量的区别,指针运算,指针变量可以加减一个整数,两

9、个同类型指针可以 相减 得到一个整数。指针变量每增减1, 地址值增减量等于所指向 的变量类型的字节数sizeof(type), 将它称作地址步进单位d。 当指针变量指向数组元素时, 指针变量每加减1,表示指针前 后移动1个元素, 地址值增减d。,如:int a10,*p;p=a; p+; p+=3;,注意: 指针变量的运算顺序。,+*p,*p+,*(+p),(*p)+ 四者之间的差别:,+*p,先给p指向的变量加1,然后取其值,(*p)+,先取p指向的变量值, 然后该变量值加1,*p+,取p所指向变量的值, 然后p增1,*+p,P先增1, 然后取p所指向变量的值,main() int a4=1

10、,2,3,4,b,c,d,e;int *p=a;b=*p+;printf(“n%d,%d,”,b,*p);c=*+p;d=+*p;printf(“%d,%d”,c,d); ,运行结果 1,2,3,4,通过指针引用数组元素,在 int a10,*p=a; 定义的情况下:,(1) p+i或a+i就是ai的地址。都要进行a+id的运算。,(2) *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素ai。数组元素中的 “ ” 是变址运算符, 相当于*( + ) , ai 相当于*(a+i)。,(3) 指向数组元素的指针变量也可带下标, 如pi与*(p+i)等价。所以, ai,*(a+i) ,p

11、i,*(p+i) 四种表示法全部等价。,(4) 注意p与a的差别,p是变量a是符号常量,不能给a赋值, 语句a=p; a+; 都是错的。,a,引用数组元素可用: 1)下标法,如ai,pi。 2) 指针法,如*(p+i)或*(a+i),其中p是指向数组a的元素的指针变量。,main( ) int a10;int *p,i;for(p=a;p(a+10);p+)scanf(“%d“, p);printf(“n“); for(i=0;i10;i+)printf(“%d“, ai); , for(i=0;i10;i+)printf(“%d“, *(a+i); p=a; /*不能省略*/for(i=0;

12、i10;i+,p+)printf(“%d“, *p); for(p=a;p(a+10);p+)printf(“%d“,*p);,例.输入/输出数组全部元素,用字符型指针访问字符数组和字符串,【例9.5】用字符型数组名和字符指针变量两种方法整体输入/输出字符串。,main() char s81=“Hello!“,*p=s;char *ps=“Welcome to you!“; printf(“%sn“,s); printf(“%sn“,ps); gets(s); printf(“%sn“,s);gets(p); printf(“%sn“,s); ,字符指针变量和字符数组的区别,(1) 存储的内容

13、不同:,字符数组存储着字符串的内容, 而字符指针变量 存放的是字符串首元素的地址,不是它的内容。,(2) 分配的内存单元不同:,字符数组分配一段有确定地址的内存。而指针变 量只分配存放地址的内存单元,该指针变量可以 指向一个字符型数据,但若未赋初值,则它并未指向 一个明确的地址。此时它指向的变量并不存在。,(3) 赋值方法不同:,对字符数组只能在定义时整体赋初值, 不能用赋值语句 整体赋值。赋值语句只能对各个元素分开赋值。,如: char s16;s=“I am a student.“;,char s16=“I am a student.“;,对字符指针变量, 可以采用下面方法赋值:char

14、*p;p=“I am a student.“;,(4) 指针变量的值是可以改变的, 字符数组名是地址常量其值是不能改变的。,数组或指针变量作函数参数,如: main( ) f(int a , int n) int array10; . . . .f(array,10) . ,由于数组名代表首地址,能接收并存放地址值的只能 是指针变量。故编译系统将形参数组名作为指针变量 来处理。例中函数首部f(int a , int n) 可写成f(int *a, int n) 两种完全等价。,归纳起来,如果有一个数组,想在被调用的函数中 改变其元素的值,实参与形参的对应关系有以下四种:,(1).实参和形参都用数组名。 (2).实参用数组名, 形参用指针变量。 (3).实参用指针变量, 形参用数组名。 (4).实参和形参都用指针变量。,实质都是地址值的传递,【例9.7】通过调用函数, 将整型数组的所有元素 加10。参数传递用四种方法实现。,void add(int b , int n) int i;for(i=0; in; i+)bi+=10; main( ) int i, a10= 1,2,3,4,5,6,7,8,9,10;add(a,10);for(i=0; i10; i+)printf(“%4d“,ai); ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号