图 第7章间接访问一指针 ©指针的概念 ©指针运算与数组 ©动态内存分配 字符串再讨论 指针作为函数参数和返回值 ©指针数组与多级指针 ®指向多维数组的指针 ©指向函数的指针 司 LoCCS
第7章 间接访问—指针 指针的概念 指针运算与数组 动态内存分配 字符串再讨论 指针作为函数参数和返回值 指针数组与多级指针 指向多维数组的指针 指向函数的指针
@ 指针的概念 ©指针就是把(变量)地址作为数据处理 ©指针变量:存储地址的变量 ©变量的指针:当一个变量存储另一个变量的地址 时,那我们说前者是后者的指针 ©使用指针的目的:提供间接访问 司 LoCCS
指针的概念 指针就是把(变量)地址作为数据处理 指针变量:存储地址的变量 变量的指针:当一个变量存储另一个变量的地址 时,那我们说前者是后者的指针 使用指针的目的:提供间接访问
③ 指针的概念 续 ©如在某一程序中定义了 int x 2; X 2 1000 如系统给x分配的空间是1000号单 元,则指向x的指针是另一个变量 p,p中存放的数据为1000 1000号单元的内容有两种访问方 1000 p 式: ·访问变量x(直接访问) ·访问变量p指向的单元的内容(间接 访问) 司 LoCCS
指针的概念 续 如在某一程序中定义了 int x = 2; 如系统给x分配的空间是1000号单 元,则指向x的指针是另一个变量 p,p中存放的数据为1000 1000号单元的内容有两种访问方 式: • 访问变量x(直接访问) • 访问变量p指向的单元的内容(间接 访问) 1000 2 1000 x p
③ 定义指针变量 ©定义指针变量要告诉编译器该变量中存放的是一 个地址。 ④指针变量的主要用途是提供间接访问,因此也需 要知道指针指向的单元的数据类型 圈指针变量的定义 类型标识符*指针变量; 如:int*intp; double *doublep; int *p,x,*q; 司 LoCCS
定义指针变量 定义指针变量要告诉编译器该变量中存放的是一 个地址。 指针变量的主要用途是提供间接访问,因此也需 要知道指针指向的单元的数据类型 指针变量的定义 类型标识符 *指针变量; 如:int *intp; double *doublep; int *p, x, *q;
图 指针变量的操作 如何让指针指向某一变量?因为我们不知道系统分 配给变量的真正地址是什么。 ·用地址运算符“&”解决。如表达式“&x”返回的是变 量x的地址。如:intp=&x; ·&运算符后面不能跟常量或表达式。如&2是没有意义的, &(m*n+p)。也是没有意义的 如何通过指针变量处理和改变它所指向的单元的值? 。用引用运算符“*”解决。如*intp表示的是intp指向 的这个单元的内容。如:*intp=5等价于x=5 ·在对intp使用引用运算之前,必须先对intp赋值 司 LoCCS
指针变量的操作 如何让指针指向某一变量?因为我们不知道系统分 配给变量的真正地址是什么。 • 用地址运算符 “&” 解决。如表达式 “&x” 返回的是变 量 x 的地址。如:intp = &x; • & 运算符后面不能跟常量或表达式。如 &2 是没有意义的, &(m * n + p )。也是没有意义的 如何通过指针变量处理和改变它所指向的单元的值? • 用引用运算符 “*” 解决。如 *intp 表示的是 intp 指向 的这个单元的内容。如:*intp = 5 等价于 x = 5 • 在对 intp 使用引用运算之前,必须先对 intp 赋值
@ 指针实例 如执行: 如有: *intp=Y+4; int X,*intp,Y; 3 1000 X=3; Y 4 1004 Y=4; →X 8 1000 intp=&X; Y 4 1004 intp 1000 intp 1000 注意:不能用 intp=100; 因为我们永远不知道变量存储的真实地址,而且 程序每次运行变量地址可能都不同。 司 LoCCS
指针实例 如有: int X, *intp, Y; X=3; Y=4; intp=&X; 如执行: *intp=Y+4; 注意:不能用 intp=100; 因为我们永远不知道变量存储的 真实地址,而且 程序每次运行变量地址可能都不同
③ 指针使用 ©指针变量可以指向不同的变量。 intp=&x; intp=&y。这时,intp与x无任何关系。 同类的指针变量之间可相互赋值,表示二个指针指 向同一内存空间。 intpl=intp; 空指针 ·指针没有指向任何空间 ·空指针用常量NULL表示,NULL的值一般赋为O ·不能引用空指针指向的值 LoCCS
指针使用 指针变量可以指向不同的变量。 intp=&x; intp=&y。这时,intp与x无任何关系。 同类的指针变量之间可相互赋值,表示二个指针指 向同一内存空间。 intp1=intp; 空指针 • 指针没有指向任何空间 • 空指针用常量NULL表示,NULL的值一般赋为0 • 不能引用空指针指向的值
指针变量的使用 设有定义 执行语句: 执行语句: 执行语句: int x,y; X=23; p1=&x; *p1=34; int *p1,*p2; y=234; p2=&y; p2=p1; 1000 X 1000 23 1000 23 X 1000 34 X 1004 y 1004 234 y 1004 234 y 1004 234 y 1008 p1 1008 p1 1008 1000 p1 1008 1000 p1 1012 p2 1012 p2 1012 1004 p2 1012 1000 p2 Loccs
指针变量的使用 设有定义 int x, y; int *p1, *p2; 1000 x 1004 y 1008 p1 1012 p2 执行语句: x=23; y=234; 1000 23 x 1004 234 y 1008 p1 1012 p2 执行语句: p1=&x; p2=&y; 1000 23 x 1004 234 y 1008 1000 p1 1012 1004 p2 执行语句: *p1=34; p2=p1; 1000 34 x 1004 234 y 1008 1000 p1 1012 1000 p2
指针实例 有以下结构 pI a B p2 b 比较执行pl=p2和*pl=*p2后的不同结果。 解: A B pl a pI a B B p2 b p2 b 司 LoCcS
指针实例 有以下结构 A p1 a B p2 b 比较执行 p1=p2和 *p1= *p2后的不同结果。 解: A p1 a B p2 b B p1 a B p2 b
指针的初始化 ©指针在使用前必须初始化。 和别的变量一样,定义指针不初始化就引用是 一个比较普通的错误。 没有初始化的指针可能指向任意地址,对这些 指针作操作可能会导致程序错误。 NULL是一个特殊指针值,称为空指针。它的值 为0。它可被用来初始化一个指针,表示不指 向任何地址。 思考:int*p;*p=5; 有什么问题? 司 LoCCS
指针的初始化 指针在使用前必须初始化。 和别的变量一样,定义指针不初始化就引用是 一个比较普通的错误。 没有初始化的指针可能指向任意地址,对这些 指针作操作可能会导致程序错误。 NULL是一个特殊指针值,称为空指针。它的值 为0。它可被用来初始化一个指针,表示不指 向任何地址。 思考:int *p; *p = 5; 有什么问题?