指针是C语言中的一个重要的概念.ppt_第1页
指针是C语言中的一个重要的概念.ppt_第2页
指针是C语言中的一个重要的概念.ppt_第3页
指针是C语言中的一个重要的概念.ppt_第4页
指针是C语言中的一个重要的概念.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

第十章 指针 指针是C语言中的一个重要的概念,也是c语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多个的值;能直接处理内存地址等,这对设计系统软件是很必要的。掌握指针的应用,可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针就不掌握C语言的精华。,重点: 1、指针的概念; 2、指针变量的概念; 3、指针变量的定义及引用; 4、指针变量作为函数的参数; 难点: 指针变量作为函数的参数,10.1 指针的概念,一、内存的访问方式 1、直接访问(通过变量名对内存单元进行存取操作。),2000 2002 2004,i j k,3 6 9 :,内存用户数据区,: :,如:i=2, j=6, k=9 printf(“%d”,i);,该输出语句是这样执行的: 根据变量名与地址的对应关系(该关系在编译时确定),找到变量的地址2000,然后将从2000开始的两个字节的内容(即3)取出后输出。,10.1 指针的概念,2000 2002 2004 3010,i j k i_p,3 6 9 2000 :,内存用户数据区,: :,2、间接访问 将变量 i的地址存放在另一个变量中。假设变量i_p用来存放整型变量的地址,它被分配3010、3011两个字节,可用下例语句将i的地址存放到i_p中。 i_p=&i ;即i-p中的的值为2000 此时,要存取变量的值,可以先找到存放“i”地址的变量i_p,从中取出i的地址(2000),然后到2000,2001字节取出i的值3。,两个概念: (1)指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。 (2)指针变量专门用于存储其它变量地址的变量 指针变量i_p的值就是变量i的地址。,10.1 指针的概念,变量的指针就是变量的地址,存放变量地址的变量就是指针变量。为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。 即:*(i_p)就是i_p所指向的变量。,10.2 变量的指针和指向变量的指针变量,因此,下面两个语句的作用相同: i=3; /*将3直接赋给变量i*/ i_p= /*将3赋给指针变量i_p所指向的变量*/,10 . 2 变量的指针和指向变量的指针变量,1、指针变量的定义 一般形式: 类型标识符 *变量名 如:int *p1; char *p2; float *p3; 说明: *表示该变量为指针型变量,指针变量名为p1,p2,p3 定义指针变量时必须指定基类型。它表示指针变量中存放的地址所指向的是什么类型的数据。 给指针变量赋值: 如:p1=&i (将i的地址赋给p1) 注:一般不直接赋数值,2、指针变量的引用 用指针变量对变量赋值: 如: int i , j , *p; p= 注意:p是地址变量,而*p 是非地址变量,与i是一回事。 “*”:为指针运算符或叫指向运算符、间接运算符。,定义后,p=&I后,*p=3后,I j p,例10.1 通过指针变量访问整型变量 main() int a,b; int *pointer_1, *pointer_2; a100;b=10; pointer_1 ,*pointer_1=&a 对吗?,运行结果为: 100, 10 100, 10,关于运算符 &*p1的含义? &*p1相当于&(*p1),等于 &(*p1)=&(a)=&a=p1 *&a的含义? *&a相当于*(&a)=*(p1)=a (2)优先级 处于第二位(见附录),(3) 自增自减运算 如: int a,b,*p; p= 当p为1000,则p+为1004,例10.2 输入a和b两个整数,按先大后小的顺序输出a和b。 main ( ) int *p1,*p2,*p, a, b; scanf (“d,d“, printf (“na=d,b=dn”,a,b); printf(“max=d,min=dn“,*pl,*p2); ,运行情况如下: 输入 5,9 回车,输出结果?,a5,b9 max9,min5,交换地址(指针变量),使p1指向大数b,而变量a、b未变。,&a,&b,5,9,&b,5,&a,9,p1 a,p2 b,p,p,p1 a,p2 b,3、指针变量作为函数参数 功能:将一个变量的地址传送到另一函数中,实参和形参均用指针。 例103 即对输入的两个整数按大小顺序输出(用函数处理)。,运行情况如下: 输入: 5,9 回车 输出: 9,5,void swap( int *p1,*p2 ) int p; p=*p1; *p1=*p2; *p2=p; void main() int a,b; int *pointer_1,*pointer_2; scanf(“d,“, if(ab) swap (pointer_1,pointer_2); printf (“nd,dn“a,b); ,函数调用过程,下面例子能不能正确交换数据? void swap (pl,p2) int *p1, *p2; int *p; ppl;p1=p2; p2p; void main() int a,b; int *pointer_1,*pointer_2; scanf (”dd“,&a,b); pointer_l=&a;pointer_2=b; if(ab) swap(pointer_ l ,pointer_2); printf(”nd,dn”,* pointer_1,*pointer_2); ,出错的原因是参量不是双向传递。,&a,&b,5,9,&a,&b,5,9,&b,5,&b,5,&a,9,&a,9,Pointer_1 a p1 a p1 a pointer_1 a,pointer_2 b p2 b p2 b pointer_2 b,(a) (b) (c ) (d),&a,&b,如果想通过函数调用得到n个要改变的值,可以用如下方法: 在主调函数中设n个变量,用n个指针变量指向他们; 然后将指针变量作实参,将这n个变量的地址传给所调用的函数的形参 通过形参指针变量,改变该n个变量的值; 主调函数中就可以使用这些改变了值的变量。,例104 输入a、b、c三个整数,按大小顺序输出。(P228),swap (int * pt1 , int * pt2) int p; p=*pt1; *pt1=*pt2; *pt2=p; exchange (int * q1, int * q2, int * q3) if(*q1*q2)

温馨提示

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

评论

0/150

提交评论