C程序设计第八章指针.ppt_第1页
C程序设计第八章指针.ppt_第2页
C程序设计第八章指针.ppt_第3页
C程序设计第八章指针.ppt_第4页
C程序设计第八章指针.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第八章 指针 指针的 概念 指针变量 指针与数组 指针与函数 复杂指针 2 C程序的变量所存放的数据: 数值型数据:整数、实数 通过前面的学习,我们已知道: 字符型数据:字符、字符串 结构型数据:数组 3 占有一定长度的内存 单元 如:int x; x占二字节、二个单元 每一个变量都有一个地址,为无符号整数, 它不同于一般的整数。 能否对地址运算? 能否用一个变量保存地址? 这些变量具有的性质:这些变量具有的性质: 问题: 4 内存的概念 内部存储器,是由存储单元组成的 。它的特点是存储单元是线性连续的。 存储单元的最小单位是字节。 5 地址的概念 为了访问内存中的某个存储单元, 我们要为它编号,这种编号称为内存地 址。通过地址我们就能够访问该地址所 标识的存储单元。 6 变量的地址 变量在内存中总占用几个连续的字 节,开始字节的地址,就是变量的地址 。 2007 7 引入指针程序设计的优点 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值 方便使用字符串、数组 8 指针的基本概念 指针:一个变量的地址称为该变量的指针 。 指针变量:若一个变量专用于存放另一个 变量的地址(指针),则称变量为指针变量 。 若指针变量p的值等于变量x的地址, 则说 指针变量p指向变量x。 1000351000 px p的值 x的内存地址 9 指针的对象 当把变量的地址存入指针变量后, 我们就可以说这个指针指向了该变量。 变量的存取方法:直接存取和间接存取。 直接存取:直接根据变量名存取数据。 间接存取:通过指针变量存取相应变量的数据。 10 定义i_pointer为指针变量,i_pointer= 如何访问? (1)先找到存放i的地址的单元地址( 3010,3011,3012,3013); (2)取出i的地址(2000); (3)到2000,2001中取出i的值3; 3 2000 变量i_pointer . 6 (j) 9 (k) . 3(i) 2000(i_pointer) 2000 2002 2004 3010 2000 i 11 指针变量的定义方法 指针变量定义的形式: 类型标识符 *标识符; 变量名 例: float *pointer_x; int *pointer_i; 作用:定义某些变量为指针类型,使之专门用于 存放地址。 12 注意: *用于定义指针变量,但指针变量名不 带*: 如 int *point_i; 定义的指针变量为point_ i ,不是*point_ i 。 一个指针变量只能指向同一类型的变量 : 如 int *point_i; point_i 只能用于指向整型变量。 无论指针变量指向何种类型,指针变量 本身都是整型的,即指针变量本身也有自己 的地址,占4个字节的存储空间。 13 指针与非指针的定义 char *pc1, *pc2; float *pf, percent; 指针的类型是使用指针时必须注意 的问题。 它们存放的都是内存的地址,但它 们的类型并不相同。 pc1,pc2只能够存放字符型变量的地址 ; pf只能够存放浮点型变量的地址; 14 指针的指向 指针定义后,一般要使指针有明确 指向。 指针初始化或者赋值。 例: int *point; scanf(“%d”,point); 编译正确,功能有误。 15 一般形式:存储类型 数据类型 *指针名=初始地 址值; 赋给指针变量, 不是赋给目标变量 例 int i; int *p= 变量必须已说明过 类型应一致 例 int *p= int i; 例 int i; int *p= int *q=p; 用已初始化指针变量作初值 例 main( ) int i; static int *p= () 不能用auto变量的地址 去初始化static型指针 指针变量的初始化 16 例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危险! 例 main( ) int i=10,k; int *p; p= *p=i; printf(“%d”,*p); . 2000 2004 2006 2005 整型变量i 10 指针变量p 2001 2002 2003 随机 指针变量必须先赋值,再使用 17 两者关系:互为逆运算 理解 . 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 指针变量 i_pointer-指针变量,它的内容是地址量 *i_pointer-指针的目标变量,它的内容是数据 -直接访问 指针变量 . 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 3 例 *i_pointer=20; -间接访问 20 直接访问按变量地址存取变量值 间接访问通过存放变量地址的变量去访 问变量 19 指针变量 . 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 整型变量k 例 k=i; -直接访问 k=*i_pointer; -间接访问 10 例子图解 10 20 例 8.1 输出变量的值。 main( ) int a,b; int *pa, *pb; a=100; b=10; pa= pb= printf(“%d,%dn”,a,b); printf(“%d,%dn”,*pa,*pb); 定义指针变量pa,pb 将a的地址送pa 将b的地址送pb 输出所指向的变量 运行结果为 100,10 100,10 ini.c 21 对*及 while(p!=NULL) . void *类型指针 表示: void *p; 使用时要进行强制类型转换 例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1; 表示不指定p是指向哪一种 类型数据的指针变量 零指针与空类型指针 零指针:(空指针) 定义:指针变量值为零 表示: int * p=0; 23 指针变量的初始化 只有三种形式: 类型名 *变量名=0; 类型名 *变量名=NULL; 类型名 *变量名=某个地址; 等价的, 表示指针 变量不指 向任何值 24 main() int *p1,*p2,*p,a,b; scanf(“%d,%d“, p1= p2= if(ap2 表示p1指的元素在后 p1=p2 表示p1与p2指向同一元素 若p1与p2不指向同一数组,比较无意义 p=NULL或p!=NULL 38 a0 a1 a2 a3 a9 . a a+9 a+1 a+2 地址 元素 下标法 a0 a1 a2 a9 a0 a1 a2 a3 a9 . p p+9 p+1 p+2 地址 元素 指针法 *p *(p+1) *(p+2) *(p+9) 变址运算符 ai *(a+i) ai pi *(p+i) *(a+i) *a *(a+1) *(a+2) *(a+9) p0 p1 p2 p9 39 a0 a1 a2 a3 a4 main() int a5,*pa,i; for(i=0;iy?x:y); return(xy?x:y); min(int x,int y) printf(“minprintf(“min=”);=”); return(x*y) return x; else return y; main() int a=2,b=3; int *p; p=f1( printf(“%dn“,*p); . 2000 2008 200A 2002 2004 2006 2 3 指针变量y 指针变量x (f1) 2002 2000 COPY 变量a 变量b (main) 指针变量p * 写一个函数,求两个int型变量中居于较大值的变 量的地址(1) maxa.c 68 . 2000 2008 200A 2002 2004 2006 2 变量a 变量b (main) 3 指针变量p *2002 int *f3(int *x,int *y) if(*x*y) return x; else return y; main() int a=2,b=3; int *p; p=f1( printf(“%dn“,*p); 写一个函数,求两个int型变量中居于较大值的变 量的地址(2) 69 int *f3(int x,int y) if(xy) return else return main() int a=2,b=3; int *p; p=f3(a, b); printf(“%dn“,*p); . 2000 2008 200A 2002 2004 2006 2 3 变量y 变量x (f3) 3 2 COPY 变量a 变量b (main) 指针变量p * 写一个函数,求两个int型变量中居于较大值的变 量的地址(3) 70 不能返回形参或局部变量 的地址作函数返回值 . 2000 2008 200A 2002 2004 2006 2 变量a 变量b (main) 3 指针变量p * 200A int *f3(int x,int y) if(xy) return else return main() int a=2,b=3; int *p; p=f3(a,b); printf(“%dn“,*p); 写一个函数,求两个int型变量中居于较大值的变 量的地址(4) 851.c 71 用于处理二维数组或多个字符串 w指针数组 定义:数组中的元素为指针变量 定义形式:存储类型 数据类型 *数组名数组长度说 明; 例 int *p4; 指针所指向变量的数据类型指针本身的存储类型 区分int *p4与int (*p)4 指针数组赋值与初始化 赋值: main() int b23,*pb2; pb0=b0; pb1=b1; int *pb2 pb0 pb1 int b23 1 2 3 2 4 6 初始化: main() int b23,*pb =b0,b1; int *pb2 pb0 pb1 int b23 1 2 3 2 4 6 指针数组和多级指针 72 L i s p 0 F o r t r a n 0 B a s i c 0 p0 p1 p2 p30 赋值: main() char a=“Fortran“; char b=“Lisp“; char c=“Basic“; char *p4; p0=a; p1=b; p2=c; p3=NULL; 或: main() char *p4; p0= “Fortran“; p1= “Lisp“; p2= “Basic“; p3=NULL; 初始化: main() char *p=“Fortran“, “Lisp“, “Basic“,NULL; L i s p 0 F o r t r a n 0 B a s i c 0 p0 p1 p2 p30 指针数组赋值与初始化 Charp.c 73 char name59=“gain”,“much”,“stronger”, “point”,“bye”; char *name5=“gain”,“much”,“stronger”, “point”,“bye”; g a i n 0 s t r o n g e r 0 p o i n t 0 m u c h 0 name0 name1 name2 name3 name4 b y e 0 g a i n 0 s t r o n g e r 0 p o i n t 0 m u c h 0 b y e 0 二维数组存储空间固定 字符指针数组相当于可变列长的二维数组 分配内存单元=数组维数*2+各字符串长度 指针数组元素的作用相当于二维数组的行名 但指针数组中元素是指针变量 二维数组的行名是地址常量 二维数组与指针数组区别: 74 main() int b23,*pb2; int i,j; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0 name1 name2 name3 name4 name Great Wall FORTRAN Computer Follow me BASIC k jk j j j i=0 例 对字符串排序(简单选择排序)图解1 76 main() void sort(char *name,int n), print(char *name,int n); char *name=“Follow me“,“BASIC“, “Great Wall“,“FORTRAN“,“Computer “; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0 name1 name2 name3 name4 name Great Wall FORTRAN Computer Follow me BASIC k k j j j i=1 k 例 对字符串排序(简单选择排序)图解2 77 main() void sort(char *name,int n), print(char *name,int n); char *name=“Follow me“,“BASIC“, “Great Wall“,“FORTRAN“,“Computer “; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0 name1 name2 name3 name4 name Great Wall FORTRAN Computer Follow me BASIC k kj j i=2 例 对字符串排序(简单选择排序)图解3 78 main() void sort(char *name,int n), print(char *name,int n); char *name=“Follow me“,“BASIC“, “Great Wall“,“FORTRAN“,“Computer “; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0 name1 name2 name3 name4 name Great Wall FORTRAN Computer Follow me BASIC k k j i=3 例 对字符串排序(简单选择排序)图解4 79 main() void sort(char *name,int n), print(char *name,int n); char *name=“Follow me“,“BASIC“, “Great Wall“,“FORTRAN“,“Computer “; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0 name1 name2 name3 name4 name Great Wall FORTRAN Computer Follow me BASIC 例 对字符串排序(简单选择排序)图解5 80 定义: 指向指针的指针 一级指针:指针变量中存放目标变量的地址 p1 int *p2; int i=3; p2= p1= *p1=5; 二级指针:指针变量中存放一级指针变量的地址 例 int *p; int i=3; p= *p=5; 例 int i, *p; p= ()/p是二级指针,不能用变量地址为其赋值 指针本身的存储类型最终目标变量的数据类型 *p是p间接指向对象的地址 *p是p间接指向对象的值例 int i=3; int *p1; int *p2; p1= p2= *p=5; i p1 p2 3 四级指针 char *p; 多级指针定义形式 82 2000 2008 200A 2002 2004 2006 1 2 变量a 变量b (main) 指针变量p 2000 指针变量q 2002 #include void swap(int *r,int *s) int *t; t=r; r=s; s=t; main() int a=1,b=2,*p,*q; p= q= swap(p,q); printf(“%d,%dn“,*p,*q); 2002 2000 COPY 指针变量s 指针变量r (swap) 指针变量t 2000 2002 2000 例 一级指针与二级指针图解1 83 2000 2008 200A 2002 2004 2006 1 2 变量a 变量b (main) 指针变量p 2000 指针变量q 2002 #include void swap(int *r,int *s) int *t; t=r; r=s; s=t; main() int a=1,b=2,*p,*q; p= q= swap(p,q); printf(“%d,%dn“,*p,*q); 输出: 1,2 例 一级指针与二级指针图解2 84 #include void swap(int *r,int *s) int *t; t=r; r=s; s=t; main() int a=1,b=2,*p,*q; p= q= swap(p,q); printf(“%d,%dn“,*p,*q); a b p q a b p q r s a b p q s r a b p q 输出: 1,2 例 一级指针与二级指针图解3 85 #include void swap(int *r,int *s) int *t; t=*r; *r=*s; *s=t; main() int a=1,b=2,*p,*q; p= q= swap( printf(“%d,%dn“,*p,*q); 2000 2008 200A 2002 2004 2006 1 2 变量a 变量b (main) 指针变量p 2000 指针变量q 2002 2006 2004 COPY 二级指针s 二级指针r (swap) 指针变量t 2000 2002 2000 例 一级指针与二级指针图解4 86 #include void swap(int *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论