第8章地址和指针第8章指针

上传人:E**** 文档编号:91643116 上传时间:2019-06-30 格式:PPT 页数:29 大小:284KB
返回 下载 相关 举报
第8章地址和指针第8章指针_第1页
第1页 / 共29页
第8章地址和指针第8章指针_第2页
第2页 / 共29页
第8章地址和指针第8章指针_第3页
第3页 / 共29页
第8章地址和指针第8章指针_第4页
第4页 / 共29页
第8章地址和指针第8章指针_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《第8章地址和指针第8章指针》由会员分享,可在线阅读,更多相关《第8章地址和指针第8章指针(29页珍藏版)》请在金锄头文库上搜索。

1、1,指针是语言中广泛使用的一种数据类型。 运用指针编程是语言最主要的风格之一。 利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。 指针极大地丰富了语言的功能。学习指针是学习语言中最重要的一环,能否正确理解和使用指针是我们是否掌握语言的一个标志。 指针也是语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。,概 述:,第八章 指 针,2,计算机中所有的数据都是存放在存储器中的。 一般把存储器中的一个字节称为一个内存单元。 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元

2、。 为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。 内存单元的编号也叫做地址。根据内存单元的编号(地址)就可以找到所需的内存单元,所以常把这个地址称为指针。 1、地址:内存单元的编号,通常一个字节(1B)一个编号。 2、指针:内存单元的地址。,地址和指针的概念,3,3、内存单元的指针和内存单元的内容是两个不同的概念,4、内存数据的访问方式: (1)直接访问按变量名存取变量 (2)间接访问将变量的地址存放在另一个变量(指针变量),通过指针变量来访问。 在语言中允许用一个变量来存放指针,这种变量称为指针变量。 一个指针变量的值就是某个内存单元

3、的地址或称为某内存单元的指针。,4,5,严格地说,一个指针是一个地址,是一个常量。 而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。 为了避免混淆,我们约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。 定义指针变量的目的是为了通过指针去访问内存单元。,注意:,6,变量的指针和指向变量的指针变量,变量的指针 变量的地址 例:&a 为变量a在内存单的存放地址,也称变量a的指针 指针变量 存放地址的变量 指向变量的指针变量 一个指针变量存放变量a的地址,则称该指针变量为指向变量a的指针变量。,例: int a=10; int *pa; pa=&a;,7,指

4、针变量的定义其一般形式为: 类型说明符 *变量名; *表示这是一个指针变量,变量名即为定义的指针变量名; 类型说明符表示本指针变量所指向的变量的数据类型(基类型)。 例如: int *p1; 表示p1是一个指针变量,它的值是某个整型变量的地址。 或者说p1指向一个整型变量。 至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。,指针变量的定义,8,static int *p2; /*p2是指向静态整型变量的指针变量*/ float *p3; /*p3是指向浮点变量的指针变量*/ char *p4; /*p4是指向字符变量的指针变量*/,再如:,注意: 一个指针变量只能指向同类型的变量,

5、如p3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。 这是由于指针的移动和运算都与基类型有关。,9,指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。 指针变量的赋值只能赋予地址,不能赋予任何其它数据,否则将引起错误。 语言中提供了地址运算符&来表示变量的地址。 其一般形式为: & 变量名; 例如:&a变示变量a的地址,&b表示变量b的地址。 变量a本身必须预先说明。,指针变量的赋值,10,(1)指针变量初始化的方法: int a; int *p=,设有指向整型变量的指针变量p,如要把整型变量

6、a 的地址赋予p可以有以下两种方式:,(2)赋值语句的方法: int a, *p; p=,11,指针变量可以进行某些运算,但其运算的种类是有限的,只能进行赋值运算和部分算术运算及关系运算。 1. 指针运算符 (1)取地址运算符 & 单目运算符,其结合性为自右至左,其功能是取变量的地址。 例:&a 即取变量a的地址 (2)取内容运算符 * 单目运算符,其结合性为自右至左,其功能是用来表示指针变量所指的变量。 在*运算符之后跟的变量必须是指针变量。,指针变量的运算(引用),12,例:void main() int a=5,*p= ,注意: 指针运算符*和指针变量说明中的指针说明符* 意义是不相同。

7、 在指针变量说明中,*是类型说明符,表示其后的变量是指针类型。 表达式中出现的*则是一个运算符用以表示指针变量所指的变量。,两个*的意义 相同么?,13,若有定义: int a, *p=&a (1) &*p 表示:p (a的地址) (2) *&a 表示: a (3) (*p)+ 相当于 a+ (4) *p+ 相当于 *(p+),即先取p所指向变量的值,然后,让p指向下一个存储单元。 (5) *+p 相当于 *(+p) 即先让p指向下一个存储单元,然后再取p所指向变量的值。,说明:,14,指针变量的赋值运算有以下几种形式: 指针变量初始化赋值,前面已作介绍。 把一个变量的地址赋予指向相同数据类型

8、的指针变量。 例如:int a,*pa; pa= /*把整型变量a的地址赋予整型指针变量pa*/ 把一个指针变量的值赋予指向相同数据类型变量的另一个指针变量。,2. 赋值运算,15,void main() int a=1,b=2,*pa= ,例如:,若改为*pa=*pb; 有何不同?,16,void main() int a=1,b=2,*pa= ,例如:,17,把数组的首地址赋予指向数组的指针变量。 例如: int a5,*pa; pa=a; (C语言规定数组名表示数组的首地址) 也可写为: pa=,指针变量的赋值运算,18,把字符串的首地址赋予指向字符类型的指针变量。 例如: char *

9、pc; pc=“C language“; 或用初始化赋值的方法写为: char *pc=“C Language“; 这里应说明的是并不是把整个字符串装入指针变量, 而是把存放该字符串的字符数组的首地址装入指针变量。 输出字符串是可以使用s格式字符串,即语句 printf(“%s”,pc);,指针变量的赋值运算,19,指针变量可以赋予0值,p=0表明p是空指针,它不指向任何变量 在头文件“stdio.h“中有: #define NULL 0 因此在C程序中常使用 int *p=NULL; 让指针变量p为空指针。 对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则

10、将造成意外错误。 而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。,说 明:,20,void main() int a,b,*p,*p1= ,例如:输入a、b两个整数,按先大后小的顺序输出,21,指针变量作为函数参数,在第七章已学过:函数的参数可以是:整型、实型、字符型等数据。 C语言中函数的参数还可以是指针类型,其作用是用来传递一个变量的地址。,22,void sawp(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; void main( ) int a,b,*p,*p1= ,例: 写一交换两个变量值的函数sawp(),23,

11、程序的执行过程,sawp(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; ,24,void sawp(int *x, int *y) int *temp; *temp=*x; *x=*y; *y=*temp; ,此语句不对,因指针temp变量没有明确指向,若将sawp函数写为如下:,25,若将sawp函数写为如下:,void sawp(int x, int y) int temp; temp=x; x=y; y=temp; ,void main() int a,b; scanf(“%d%d“, ,26,程序的执行过程,sawp(int x, int y) int temp; temp=x; x=y; y=temp; ,27,void sawp(int *x, int *y) int *temp; temp=x; x=y; y=temp; void main( ) int a,b,*p,*p1= ,再如:,28,程序的执行过程,sawp(int *x, int *y) int *temp; temp=x; x=y; y=temp; ,29,说明:,形参和实参之间的数据传递是单向的“值传递”,指针变量做函数参数也要遵循这一原则。 调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。,

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

当前位置:首页 > 高等教育 > 大学课件

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