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