《程序设计》cs.u20119 第7章间接访问指针 指针的概念 指针运算与数组 动态内存分配 字符串再讨论 冷指针作为函数参数和返回值 冷指针数组与多级指针 指向多维数组的指针 指向函数的指针 程序设计-1
《程序设计》 cs.sjtu 2011.9 程序设计 - 1 第7章 间接访问—指针 ❖ 指针的概念 ❖ 指针运算与数组 ❖ 动态内存分配 ❖ 字符串再讨论 ❖ 指针作为函数参数和返回值 ❖ 指针数组与多级指针 ❖ 指向多维数组的指针 ❖ 指向函数的指针
指针介绍 《程序设计》cs.u20119 本章将介绍C艹语言的一个重要的特性:指针,为了 成为一个优秀的C艹语言程序员,你必须掌握指针 并熟练地使用它们。 指针 是内存的地加并可作为数据 是一个灵活和危险的机制 °允许处理数据 °允许内存动分配(只要需要,而非预先定义) 程序设计-2
《程序设计》 cs.sjtu 2011.9 程序设计 - 2 指针介绍 本章将介绍C++语言的一个重要的特性:指针,为了 成为一个优秀的C++语言程序员,你必须掌握指针 并熟练地使用它们。 指针 •是内存的地址并可作为数据 •是一个灵活和危险的机制 •允许共享处理数据 •允许内存动态分配(只要需要,而非预先定义)
《程序设计》cs.u20119 指针的概念 指针就是把地址作为数据处理 指针变量:存储地址的变量 变量的指针:当一个变量存储另一个变量的 地址时,那我们说它就是那个变量的指针 使用指针的目的:提供间接访问 程序设计
《程序设计》 cs.sjtu 2011.9 程序设计 - 3 指针的概念 ❖ 指针就是把地址作为数据处理 ❖ 指针变量:存储地址的变量 ❖ 变量的指针:当一个变量存储另一个变量的 地址时,那我们说它就是那个变量的指针 ❖ 使用指针的目的:提供间接访问
《程序设计》cs.u20119 指针的概念续 冷如在某一程序中定义了 int x=2 X 21000 冷如系统给x分配的空间是1000号单 元,则指向x的指针是另一个变量 p,p中存放的数据为1000 1000号单元的内容有两种访问方 1000 式 >访问变量x(直接访问) 访问变量p指向的单元的内容(间接 访问) 程序设计-4
《程序设计》 cs.sjtu 2011.9 程序设计 - 4 指针的概念 续 ❖ 如在某一程序中定义了 int x = 2; ❖ 如系统给x分配的空间是1000号单 元,则指向x的指针是另一个变量 p,p中存放的数据为1000 ❖ 1000号单元的内容有两种访问方 式: ➢ 访问变量x(直接访问) ➢ 访问变量p指向的单元的内容(间接 访问) 1000 2 1000 x p
《程序设计》cs.u20119 定义指针变量 冷定义指针变量要告诉编译器该变量中存放的是一 个地址 指针变量的主要用途是提供间接访问,因此也需 要知道指针指向的单元的数据类型 冷指针变量的定义 类型标识符指针变量; 如:int*intp; double *doubler int *p, x, q9 程序设计-5
《程序设计》 cs.sjtu 2011.9 程序设计 - 5 定义指针变量 ❖ 定义指针变量要告诉编译器该变量中存放的是一 个地址。 ❖ 指针变量的主要用途是提供间接访问,因此也需 要知道指针指向的单元的数据类型 ❖ 指针变量的定义 类型标识符 *指针变量; 如:int *intp; double *doublep; int *p, x, *q;
《程序设计》cs.u20119 指针变量的操作 如何让指针指向某一变量?因为我们不知道系统分 配给变量的真正地址是什么。 用地址运算符“&”解决。如表达式“&x”返回的是变量 x的地址。如:intp=&x; >&运算符后面不能跟常量或表达式。如&2是没有意义的 &(m*n+p)也是没有意义的 冷如何通过指针变量处理和改变它所指向的单元的值? >用引用运算符“*”解决。如*intp表示的是intp指向的 这个单元的内容。如:intp=5等价于x=5 >在对intp使用引用运算之前,必须先对intp赋值 程序设计-6
《程序设计》 cs.sjtu 2011.9 程序设计 - 6 指针变量的操作 ❖ 如何让指针指向某一变量?因为我们不知道系统分 配给变量的真正地址是什么。 ➢ 用地址运算符 “&” 解决。如表达式 “&x” 返回的是变量 x 的地址。如:intp = &x; ➢ & 运算符后面不能跟常量或表达式。如 &2 是没有意义的, &(m * n + p )。也是没有意义的 ❖ 如何通过指针变量处理和改变它所指向的单元的值? ➢ 用引用运算符 “*” 解决。如 *intp 表示的是 intp 指向的 这个单元的内容。如:*intp = 5 等价于 x = 5 ➢ 在对 intp 使用引用运算之前,必须先对 intp 赋值
《程序设计》cs.u20119 指针实例 如执行 如有 intp=Y+4: int X, *intp, Y X|3 1000 X=3 1004 Y=4 X 8 1000 tp=&X Y4 1004 intp 1000 p1000 注意:不能用intp=100; 因为我们永远不知道变量存储的真实地址,而且 程序每次运行变量地址可能都不同。 程序设计-7
《程序设计》 cs.sjtu 2011.9 程序设计 - 7 指针实例 如有: int X, *intp, Y; X=3; Y=4; intp=&X; intp 1000 1004 Y 4 1000 X 3 如执行: *intp=Y+4; intp 1000 1004 Y 4 1000 X 8 注意:不能用 intp=100; 因为我们永远不知道变量存储的 真实地址,而且 程序每次运行变量地址可能都不同
《程序设计》cs.u20119 指针使用 冷指针变量可以指向不同的变量。如上例中intp指向x, 我们可以通过对ntp的重新赋值改变指针的指向。 如果想让intp指向y,只要执行intp=&y就可以了。 这时,int与x无任何关系。 同类的指针变量之间可相互赋值,表示二个指针指 向同一内存空间。 空指针 >指针没有指向任何空间 >空指针用常量NULL表示,NULL的值一般赋为0 >不能引用空指针指向的值 程序设计-8
《程序设计》 cs.sjtu 2011.9 程序设计 - 8 指针使用 ❖ 指针变量可以指向不同的变量。如上例中intp指向x, 我们可以通过对intp的重新赋值改变指针的指向。 如果想让intp指向y,只要执行intp=&y就可以了。 这时,intp与x无任何关系。 ❖ 同类的指针变量之间可相互赋值,表示二个指针指 向同一内存空间。 ❖ 空指针 ➢ 指针没有指向任何空间 ➢ 空指针用常量NULL表示,NULL的值一般赋为0 ➢ 不能引用空指针指向的值
《程序设计》cs.u20119 指针变量的使用 设有定义 执行语句:执行语句:执行语句: Int x, y; x=23 p1=&X; p1=34 ntp1,p2;y=234; p2=&y; p2=p1 1000 100023 100023 100034 1004 1004234 1004234 1004234 1008 pl1008 pl10081000p110081000p1 1012 p21012 p210121004p210121000p2 程序设计-9
《程序设计》 cs.sjtu 2011.9 程序设计 - 9 指针变量的使用 设有定义 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
指针实例 《程序设计》cs.u20119 有以下结构 p1 a Bb 比较执行p1=p2和*p1=*p2后的不同结果。 解 B p B B 2 b 2 程序设计10
《程序设计》 cs.sjtu 2011.9 程序设计 - 10 指针实例 有以下结构 A p1 a B p2 b 比较执行 p1=p2和 *p1= *p2后的不同结果。 解: A p1 a B p2 b B p1 a B p2 b