程序设计基础08指针
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
地址 0 1 2 3 …
……
2000 45
……
内存 计算机的内存中的每一个字节都有一个编号 变量内容 所有的内存单元都要统一进行“编号” 这个编号就是该字节在整个内存中的“地址” 所有的内存单元都要有地址 每一内存单元具有唯一的内存地址 系统为每一个已定义的变量分配一定存储空间 使变量名与内存的一个地址相对应 通过地址我们就能够访问该地址所标识的存储单元 程序处理过程 需要根据地址取出变量所对应的内存单元中存放的值 参与计算/操作 处理结果存入相应的变量名所对应的内存单元
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
21
3.指针变量
指针变量的引用
例:用指针变量进行输入输出
main() { int *p,m; scanf(“%d”,&m); p=&m; printf(“%d”,*p); }
main() { int *p,m; p=&m; scanf(“%d”, p ); printf(“%d”, m ); }
运行结果完全一样。请思考一下若将程序修改为如下形式:
main() {int *p,m; scanf(“%d”, p ); p=&m; printf(“%d”, m ); }会产生什么结果? 程序设计基础(C语言)—— www.neu.edu.cn/cxsj
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
12
2.指针变量
指针变量的声明 提示 在定义指针时可以用void将指针定义为空类型 不指定指针指向一个确定的类型 区分“值”与“内容”的含义 例如 整型变量是内容为整型数值的变量 整型指针变量是存放整型变量地址的变量 在引用指针变量前必须首先让指针指向一个变量 这一点非常重要 定义指针变量后,并未确定该变量指向何处,该变量 的值是不确定的 内存单元 指针变量p的地址 指针P
内存单元
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
15
2.指针变量
指针变量初始化 提示 在使用指针之前一定要对其进行初始化 否则程序不知道指向何处 系统在执行程序时会给出如下的信息 run-time error R6001——null pointer assigment 或者引起更严重的错误——系统崩溃 对未使用的指针应该赋以空值NULL 表明它未指向任何地方 这并不是对指针的初始化 只是 表示该指针未被使用而已
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
14
2.指针变量
指针变量初始化 在使用指针变量时,要首先对指针变量进行初始化,让指针变量 指向一个具体的变量 初始化的方式 给指针变量赋空值(赋值为符号常量NULL ) 例 p=NULL;/*表示指针p为空,没有指向任何对象*/ 一般情况下给没有初始值的指针变量赋值为NULL 实际上,NULL是整数0,系统保证0单元不存储任何 数据的值(地址) NULL是头文件<stdio.h>以及其它几个头文件中定义 指针变量 的符号常量 指针P 空地址NULL
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
17
2.指针变量
指针变量初始化 提示 演示91。C 用void将指针定义为空类型 即不指定指针指向一个确定的类型 例如:void *p;/*表示指针变量P不指向一个确定的类型*/ 它的作用仅用来存放一个地址 作用 任何类型的指针都可以赋给指向void类型的指针 指向void类型的指针也可以赋给任何类型的指针 但是:不能复引用void*类型的指针 编译器不能根据类型确定它引用的字节数 常见错误 将一种类型的指针赋给另一种类型的指针,而这两种指针都不 是void*类型
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
20
3.指针变量
指针变量的引用 当指针变量定义和赋值之后,引用变量的方式 用变量名直接引用 例如 scanf(“%d”,&a);/*在函数中直接使用变量a的地址 */ 通过指向变量的指针间接引用 利用指针变量,提供对变量的一种“间接访问”形式 指针变量的引用形式 *指针变量 含义是指针变量所指向的值 例如 int a=3,*pa; pa=&a; /* 指针pa指向变量a*/ printf("%d\n",*pa); /* 通过 * 运算符实现间接访问 */
5
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
1.预备知识
计算机的寻址方式
直接寻址
存入/取出 数据 数据
内存
地址 … 1003
间接寻址
1004
1008
100C
存入/取出
内存 地址 …
地 址 1050 1051 …
数据
数据 …
6
B单元
3020 3021 A单元
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
1010 1012
300
2002 2004
1010
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
9
2.指针变量
定义
用于指向其他变量的变量 指针变量是一个变量 和普通变量一样占用一定的存储空间 该存储空间存放的是一个地址值而不是普通的数据值 指针变量是一个地址变量 指针变量的值是一个内存单元的地址 它指向另一个变量的值 指针就是地址 当将变量的地址存入指针变量后,就说这个指针指向了该变量 指针变量只能存放某一数据类型的变量 问题? 变量的类型和指向变量的类型之间的区别?
8
1.预备知识
C语言如何处理?
直接访问 通过变量名访问数据的方式称为"直接访问" 例如:printf("%d", n); /* 通过变量名访问变量n */ 间接访问 如果将变量n的地址存放在另一个变量pn中,通过 访问变量pn,间接达到访问变量i的目的,这种方 式称为变量的"间接访问" 在C语言中,间接寻址方式访问内存是通过指 针变量实现的 指针变量通过直接寻址方式访问获得的是 一个地址值 在该地址起始的一个存储单元中存放程序 需要的数据
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
7
1.预备知识
地址 2000 2001 2002 2003 2004 2005 2006 2007 „a‟ ch char 1 pi 3.1415926 float 4 10 变量名 i 变量类型 int 字节数 2
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
1.预备知识
C语言如何处理?
高级语言中的变量具有三个属性 变量的名、变量的值、变量的地址 编程者使用c程序的一个变量 定义变量的数据类型 数据类型决定了一个变量在内存中所占用的存储空间的大小 变量在内存中总是占用几个连续的字节 定义变量名 C语言的编译系统会根据变量的数据类型为该变量分配内存单 元 确定变量的地址 变量的地址就是为变量分配的内存单元的起始编号 就可以通过变量名对内存中变量对应的地址进行操作
程序设计基础(C语言)
东北大学高级语言程序设计课程组 课程网站:www.neu.edu.cn/cxsj
程序设计基础(C语言)
指针
概述
指针是C语言的重要概念之一 它使C语言比之其它程序设计语言更具特色 深入理解C语言特性 指针是学习使用C语言的难点 指针是C语言的一个重要概念 正确而灵活地使用指针 有效地描述各种复杂的数据结构 动态地分配内存空间 自由地在函数之间传递各种类型的数据 使程序简洁、紧凑,执行效率高 指针是C提供的一种数据结构 属于简单数据类型 它的意义和作用明显又不同于一般的数据类型
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
19
3.指针变量
指针变量的运算
C语言提供的指针运算
取内容运算(*) 运算对象必须是指针(该指针所指向的对象可以是任意类型) 作用是取指针所指向变量的内容。*也称为“间接引用运算符”或 “指针的复引用” 例如 a=*prt; /*表示指针 prt所指向变量的内容赋a*/ int a=3, *p, x; pa=&a; x=*pa; /* *pa表示取指针变量pa所指单元的内容,即变量a的值, 则x=3 */
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
11
2.指针变量
指针变量的声明 提示 声明语句的*只能用于指针变量 这种表示方式说明被声明的变量是一个指针 *不针对声明语句中的所有变量 每一个指针都必须在其名字前面有一个前缀*声明 例如:int *pt1,pt2; pt2为整型变量而不是整型指针变量 指针变量名是pt1而不是*pt1 指针变量只能指向定义时规定的类型变量 只有同一数据类型的地 址才能存放在指向该类型变量的指 针变量中 例如: int *ip;/*ip指针变量只能存放整型变量的地址*/
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
10
2.指针变量
指针变量的声明
指针变量与一般的变量的区别
格式 <数据类型名> *指针变量名; 说明 数据类型表示指针所指向的数据的数据类型 提示:不是指针变量的数据类型 *是指针的标志,表示它后面的变量名是指针类型 例 int *i_p;/*定义了指针变量i_p ,指向的对象类型为整型*/ char *cp;/*定义了指针变量cp, 指向的对象类型为字符 型*/
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
16
2.指针变量
指针变量初始化 提示 一个指针变量赋空值与不赋值是完全不同的概念 前者是有不指向任何变量的地址 后者是一个不确定的随机值 这时指针可能指向一个事先未指定的数据 利用空指针可以简化程序代码、提高效率 指针变量应具有无符号整型类型的值 存放的是地址 由于地址本身的特征,不能将一个整型值赋给一个指针变量。 同样也不能将指针变量的值赋给一个整型变量 例如:int *p;p=2000;(非法)
13
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
2.指针变量
指针变量初始化 在使用指针变量时,要首先对指针变量进行初始化,让指针变量 指向一个具体的变量 初始化的方式 使用赋值语句 例 int i, *pi; /* 说明指针变量pa和变量a */ pi=&i; /*使用取地址符&把变量i的地址赋值给指针 变量:pi指向了整型变量i */ 说明指针变量的时候同时进行 例:使用先声明变量的地址 int i,*pi=&i; 问题? 写成int *pa; *pa=&a;会出现什么问题?
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
3
1.预备知识
直接和间接的含义
A 直接
内存
特点
B
A
间接
即内部存储器,是由内存单元组成
存储单元是线性连续的 存储单元的最小单位为字节
…… ……
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
4
1.预备知识
程序设计基础(C语言)—— www.neu.edu.cn/cxsj
18
【例】定义指针变量 void *p2; int *p1,i=5; p1=&i;p2=p1;
3.指针变量
指针变量的运算 C语言提供的指针运算 取地址运算(&) 作用是取变ຫໍສະໝຸດ Baidu的地址 运算对象必须是(任意类型的)变量 例如 &i /*表示求变量 i的地址*/ int x=3, *p; p=&x /* &x表示取x的地址,将变量x地址赋给指针变 量p */ 提示 &是一个单目运算符,它返回变量的地址 &的操作数必须是一个变量 取地址运算符“&”是取操作对象的地址而不是其值