第7部分 指针、指针与数组 →·编程步骤: ·分析→程序框架(粗算法)→细算法→程序→调试
第7部分 指针、指针与数组 •编程步骤: •分析→程序框架(粗算法)→细算法→程序→调试
新的概念:指针( Pointer) 指针也是一种数据类型 种特殊的数据类型,这种类型存储的是地 址 c/c++的特色 有些复杂但很实用 指针变量与指针常量 指针变量 专门存放地址数据的变量 指针常量 !一个固定的地址,例如:数组名
2 新的概念:指针(Pointer) ▪ 指针也是一种数据类型 ▪ 一种特殊的数据类型,这种类型存储的是地 址 ▪ C/c++的特色 ▪ 有些复杂但很实用 ▪ 指针变量与指针常量 ▪ 指针变量 ▪ 专门存放地址数据的变量 ▪ 指针常量 ▪ 指一个固定的地址,例如:数组名
两种寻址方式 如何读写内存中的数据? 通过变量的地址访问变量所 在的存储单元 两种寻址方式 直接(寻址)访问 ■直接按变量地址来存取 变量内容的访问方式 间接(寻址)访问 东西 房间1 的钥匙 ■通过指针变量来间接存 取它所指向的变量的访 房间1房间2 问方式 直接寻址间接寻址
3 两种寻址方式 ▪ 如何读写内存中的数据? ▪ 通过变量的地址访问变量所 在的存储单元 ▪ 两种寻址方式 ▪ 直接(寻址)访问 ▪ 直接按变量地址来存取 变量内容的访问方式 ▪ 间接(寻址)访问 ▪ 通过指针变量来间接存 取它所指向的变量的访 问方式 房间1 东西 房间2 房间1 的钥匙 直接寻址 间接寻址
重点:直接寻址与间接寻址的表示 数据类型:int*(指向 直接寻址整型变量的指针) 变量名 ti:|·变量名称:pi 变量的初值:&i i=3 含义:向系统申请一个3变量i 间接寻址动态区的内存空间,用 来存储整型指针变量p的 初值&i,即将p指向了变 int pi; 量i。 30102004变量p pi=&i:(·通过*p这种形式,实现对变 量i间接引用。 3 如果能直接寻址那当然就不用间接寻址了 但有时,只能用间接寻址的方法解决问题
4 ▪间接寻址访问: int i; int *pi; pi=&i; *pi=3; 重点:直接寻址与间接寻址的表示 ▪ 直接寻址访问: int i; i=3; 2000 0 ┇ 变量 i ┇ 3010 变量pi 地址 数据 变量名 •如果能直接寻址那当然就不用间接寻址了, 但有时,只能用间接寻址的方法解决问题 ③ ▪ 数据类型:int *(指向 整型变量的指针) ▪ 变量名称:pi ▪ 变量的初值:&i ▪ 含义:向系统申请一个 动态区的内存空间,用 来存储整型指针变量pi的 初值&i,即将pi指向了变 量i。 ▪ 通过*pi这种形式,实现对变 量i的间接引用。 ② ① 2000 3
为什么引入指针的概念 指针有如下好处: 为函数提供修改变量值的手段 为C的动态内存分配系统提供支持 可以改善某些子程序的效率 为动态数据结构(如例链表、队列、二叉 树等)提供支持
5 为什么引入指针的概念 ▪ 指针有如下好处: ▪ 为函数提供修改变量值的手段 ▪ 为C的动态内存分配系统提供支持 ▪ 可以改善某些子程序的效率 ▪ 为动态数据结构(如例链表、队列、二叉 树等)提供支持
为8若 应在类型相 同的指针变 int i 个指针变量不能 量之间赋值 float * p; 指向与其类型不同 &i; 的变量flot称inti:*p=&i 变量P的基类型 float j, q=&j; p=q. int"p P=100 int *p 必须进行赋值 p=100 才能引用否则int"p p指向了哪呢?5 canf(%p“p) 指针变量只 p=100 存放地址! 对指针变量赋值只能通 int i,p 过&求得! p=100:
6 int i,*p; p=&i; *p=100; int i,*p=&i; float j,*q=&j; p=q; int i; float *p; p=&i; int *p; 必须进行赋值 p=100; 才能引用!否则 p指向了哪呢? 一个指针变量不能 指向与其类型不同 的变量!float又称 变量P的基类型 应在类型相 同的指针变 量之间赋值 int *p; scanf(“%p”,&p); *p=100; 指针变量只 存放地址! int *p; *p=100; 对指针变量赋值只能通 过&求得!
maino 例:读程序 [int a=5, b=10: int *pa=&a, pb=&b pb=-1 b printf((b=%dn”,pb);「&a &b printf(*pa=%d, pb=yd",, pa, pb); ●读程序的关键: 指针变量指向哪儿? 所指向的变量里存储的数据是多少? 更改的是指针还是指针所指向的变量?
7 main() 例:读程序 {int a=5,b=10; int *pa=&a, *pb=&b; *pb=-1; printf(“b=%d\n” , *pb); pa=pb; printf(“*pa=%d,*pb=%d” ,*pa,*pb); } •读程序的关键: –指针变量指向哪儿? –所指向的变量里存储的数据是多少? –更改的是指针还是指针所指向的变量? &a &b pa pb 5 10 a b -1
传数值调用 主调函数 实参 十、 形参被调函数N maino void Swap(int x, int y) i int a, b int temp a=5 temp= x, X =y, Swap(a, b): y= temp: rinf C"a=%d,b=‰d",a,b) femp 5 5 9 9 5 b Xy 8
8 主调函数 被调函数 main() { int a, b; a = 5; b = 9; Swap(a, b); printf ("a=%d,b=%d",a,b); } void Swap(int x, int y) { int temp; temp = x; x = y; y = temp; } 5 5 a b 实 参 形 参 9 9 a b x y 传数值调用 x y 5 temp 9 5
传地址调用 主调函数 实参 十 形参被调函数 maino void Swap(int *x, int * y) i int a, b: nt temp. a=15 b=8 指针的好处之一: Swap(&a, &b) 通过将主调函数变量的 printf"a%%b)地址传给形参实现了改变 主调函数中变量的值。 当计算结果不只一个时, 95 地址值 可以用这种方法,实现数 据的“返回”。 x
9 主调函数 被调函数 main() { int a, b; a = 15; b = 8; Swap(&a, &b); printf("a=%d,b=%d",a,b); } void Swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } &a 实 参 形 参 &b a b x y 传地址调用 x y 5 temp 5 a b 9 95 地址值 •指针的好处之一: •通过将主调函数变量的 地址传给形参实现了改变 主调函数中变量的值。 •当计算结果不只一个时, 可以用这种方法,实现数 据的“返回
指针变量与其它类型变量的 对比 共性 在内存中占据一定大小的存储单元 先定义,再使用 指针变量的特殊性 指针变量只能存放地址,而不能存放数据 必须初始化后才能使用,否则指向不确定的存储单 元 只能指向同一基类型的变量,否则 warning 可参与的运算:加、减、关系、赋值 10
10 指针变量与其它类型变量的 对比 ▪ 共性 ▪ 在内存中占据一定大小的存储单元 ▪ 先定义,再使用 ▪ 指针变量的特殊性 ▪ 指针变量只能存放地址,而不能存放数据 ▪ 必须初始化后才能使用,否则指向不确定的存储单 元 ▪ 只能指向同一基类型的变量,否则warning. ▪ 可参与的运算:加、减、关系、赋值