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

下载本文档

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

文档简介

1、第十章 指 针Pointers,功能: 1、有效地表示复杂的数据结构 2、能动态分配内存 3、能方便地使用字符串 4、有效方便地使用数组 5、在函数调用时能得到多于1个地值 6、能直接处理内存地址,10.1 地址和指针的概念,变量的静态特性 在源程序中 以变量名出现 main() int m2; int n =1; m = n ; ,在执行指令序列 以地址身份出现 mov (2000),(2002) ,变量的动态特性,结论:程序执行时,变量的名字不存在 取而代之是分配给变量的单元地址. 因此有必要提供对地址的管理指针,几个概念,指针型数据:该数据表示了内存中某一存储单元的地 址值,如2000,

2、2002,2004,3010等 2. 指针类型:能表示指针型数据的一种数据类型 3. 指针变量:被定义为指针类型的变量,用来存放另一 存储单元的地址值。,如 i_pointer, 自身的变量的2000:表示对地址值为2000的存贮单元(即变量i)的指向,也称其为变量 i 的指针 可简化表示为右图, 称 i_pointer为变量 i 的指针,如对(整型)变量 i 的访问:,指针变量与普通变量的区别,1、普通变量用来存储单元的内容 2、指针变量用来存储单元的地址 称变量 i_pointer 为变量 i 的指针,i 的指针与 i 的区别在于:i的值是 3它是内存单元1000的内容;而 i 的指针是存

3、放变量 i 的地址1000通过该指针可间接取得变量 i的值。(改错P48),10.1.2 指针变量的说明,格式:,存储类别 所指(后面)数据类型 *变量=初值 ;,例: float *p ; /*说明p为指向实型变量的指针变量*/ int x, *px; /*说明了整型变量x和指向整型变量的指 针变量Px*/ double *pc; /*说明了指向双精度实型变量的指针变量*/,10.1.3 指针变量的使用,指针变量的运算符: 取地址运算符 含义:置指针p为空,即没有指向任何对象 语句:if (p=NULL) 含义:判断指针P是否为空,若指针p为空,则表达式成立。,例如: int x=10, y

4、 ,*px; p= /*说明变量 a和指针变量pa */ pa= /*将变量a的地址赋给指针pa */,int a , *pa= /*说明变量 a和指针变量pa并 */ 将变量a的地址赋给指针pa */,(3)避免错误,int a ; *pa= /*发生指针变量指向数据类型的错误*/,10.1.5 引用指针变量,当指针变量定义和赋值之后,引用变量的方式可以用变量名直接引用,也可以通过指向变星的指针间接引用。,10.2 指针变量作函数参数,10.2.1 指针作函数的参数 C中指针表示地址的概念,指针作函数的参数就是指在 函数间传递变量的地址。要注意实参的数据类型要与作为 形参的指针所指的对象的数

5、据类型一致。,指针px所指的内容加指针py所指的内容,通过指针参数使函数返回多个值,函数调用结束时返回一个 (且仅一个)结果,称为函数的返回值,并且参数间的值传递使函数只能作用于形参变量而无法修改实参变量的值。如例9-6 中swap函数。,仅仅实现函数中x与y交换,没有实现a 与 b单元数据的交换,/*将py指向单元中的值赋给px指向的单元里*/,/*将px指向单元中的值赋给临时变量temp*/,/*将临时变量temp的值赋给px指向单元中*/,/*问题:int *temp ; 这样定义可以吗?*/,例103 用函数交换函数swap中两个变量的值。,1. 进入swap函数时各个 变量的状态和相

6、互关系,2. swap函数的执行过程 和各个变量的值的变化 过程,10.2.2 函数的返回值为指针,格式:返回数据类型 * 函数名(形参表) return (地址) ; ,例104 使用函数求两个变量的最大值。, ,3,6,2000,2002,2004,变量a,变量b,3010,参数指针a,3012,参数指针b,3014,指针变量p,10.2.3 指向函数的指针,2000(i)变量指针 p变量指针变量,一、概念,2.函数指针变量 用来存放函数入口地 址的变量:p,1.函数的指针 函数的入口地址 1000,1100 (函数名),二函数指针变量的定义,函数返回类型 (*函数指针变量)();,例:

7、int (*P) ( ) ;有一个指针变量指向函数 即p的值因为一函数的入口 所指函数返回值为整型,试比较下面两个说明语句:,三、赋值,int (*p)(); /*定义一函数指针*/ 赋值: 将函数max 的入口地址给p p = max ; 将函数max 的入口地址给p p = add ;,四、通过函数指针调用函数,10.3 数组与指针,10.3.1 通过指针引用一维数组中的元素 数组在内存中占据一段连续空间,数组名表示首地址。 例:int x, y, z, a612, 15, 18, 21, 24, 27;,地址 a a+1 a+2 a+3 a+4 a+5,18 24,数据元素的访问的方式:

8、 (1)通过下标: 例: xa2;z=a4;,1000 1002 1004 1006 1008 100A 100C 100E 1010,(2)通过地址: 例: y*(a+3);,(3)通过指针: 例:int *p=,指针操作与数组元索的关系,1:若p1= 则*p1=? , p-n; 表示:指针当前指向位置的前方(-) 或者后方(+)第n个数据的位置 而*(pn)可分别访问相应的元素。,例10-6 main() int x, y, a10 , *p= ,结果:6,15,3,9,5 注意:*(p+n)和*p+n的区别,(2) p-; p+; 表示:指针当前指向位置的前一个 (-)或者后一个(+)数

9、据的位置 则:p+: p指向a5, *p+: 值为18,(3) p=p-4 ; p=p+5 ; 表示:指针移到当前指向位置的前4个 (p4)或者后5个(p+5)数据的位置。 则:p=p-4,*p; 修改后p指向a0,并取a0的值,结论:(2)和(3)的操作改变了指针变量本身的值,若 int a10, n=3 ,*p=,注意1: 运算是以指针指向的数据类型长度为计量单位的。 设 int a10, *p=a; 则 p=p+1后, p所指的内存地址加了 2;,若 long b5, *q= b ; 则 q=q+1后, q所指的内存地址加了 4。 对指针p,pn表示的内存地址值为: p(n数据类型长度字

10、节数),单目运算遵守右结合:,例:设 int a10,*p=,12 12 13 15 9 13 指a4 指a2 指a3 指a4 指a2 指a3,2. 指针的关系运算,若指针p、q指向相同数据类型(如指向数组a),指针的关系运算实际上是两个指向位置的前后比较。 如二指针p、q,若: pq时,则p指向位置在q指向位置之后。,例题:输出数组全部元素,main() int a5 , i ; for(i=0;i5;i+) scanf(“%d”, ,1、用下标访问,10.3.3 通过指针二维数组和指针,(1)两个一维数组的嵌套 int a43=65,67,70 行首址的概念 a0 60,80,87 a1

11、90,81,90 a2 99,93,88; a3 (2) 在内存中按行优先线性存放 int a34=65,67,70,60,80,87,90,81,90,99,93,88; aij一维线性地址a首址+i*行数+j, p=s; /*p初始指向s数组的首地址*/ s8=A /*改变字符数组中保存的值*/ p=s+8; /*改变p的指向位置 */ p=ss; /*指向另一个字符数据*/ printf(“string is %sn”,p); ss =ss+1 ;,(2)直接定义字符串常量 char *string=Happy!; (3)直接赋予字符串常量 char *string; string=Ha

12、ppy!,注意: 指向字符串常量的指针不能被修改另指其他。 如上面的string,操作 string=string+5 ; 出错 (2) 字符串常量可以赋给字符指针,不能赋给数组 即:char s ; s=“Happy”; 出错 可修改为: strcpy(s, “Happy”);,10.4.2 常见的字符串操作,#include “stdio.h” main() char a40 , b40 ; char *strcpy(char *, char *); int strlen(char *); char *strcat(char *, char*); gets(a) ; printf(“b=%

13、sn”, strcpy(a,b) ); printf(“len=%dn”,strlen(a); gets(b); printf(“a=%sn”,strcat(a,b) ); ,例 用指针作为函数的形式参数,编写字符串复制、字符 串联接、求字符串长度的函数。,char *strcpy (char *str1,char *str2) (1) while ( (*str2=*str1) !=0) str2+; str1+; return (str2); (2) while ( (*str2+=*str1+)!=0); return (str2) ; (3) while (*str2+=*str1+)

14、; return (str2) ; (4) for (; *str2+=*str1+;) ; return (str2) ; ,int strlen (char *str) /*方法一*/ int *p=str; while ( *p) p+; return (p-str) ; /*方法二*/ int len=0; while ( *str) len+; str+; return (len) ; ,str,char *strcat (char *str1, char *str2) char *p=str1; while ( *p !=0) /*第一步*/ p+; while (*p+=*str

15、2+) ; /*第二步*/ return (str1) ; ,str2,第一步 将指针移动第一个串的尾部 第二步 将第二个串的内容拷贝到从第一个串尾部以后,/* (1) */,/* (3) */,例10-15 输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数使合并后的字符串,仍然是从小到大排列。,/* 确定哪一个是还没有处理完的串*/,指针p,指针q,指针r,10.5 指针数组,10.5.1 指针数组与数组指针,指针数组(数组元素为指针) 数组指针(指向数组的指针),类型 *数组名长度 ;,类型 (*指针名)长度 ;,int *pa5 int (*pb)5,int *a5

16、, x, y, z; a0=,在比较大小的过程中,只修改booki中指针的指向,booki和bookj表示了两个字符数组的首地址,10.5.2 指针数组作main函数的形参,main(int argc,char *argv ),1概念 熟悉的主函数书写:main() 理解:函数 main 由系统调用 问题:main() 可以带参数吗?,2定义格式:,3main函数参数特点 其实际参数在命令行输入,传递给形参。 其形式参数的个数和类型是由 c语言规定好的, 但名称可任意。,例: copy命令格式如下: copy a:*.* c: 功能:将a盘上的所有文件拷贝到 c 盘 问题:如何用c实现,参数

17、“a:*.*”, “c:”如何带入程序 实现:main带参数方法,4应用 在编写系统命令时尤为有用。,注意:argc值一定大于0,文件 copy.c 中定义: main(int argc, char *argv) 若命令行为 c: copy a:*.* c:,例题:若在命令行中输入: c:file1 x1 y2 c3 问:程序接受的 argc=? argv=?,解:argc= ;,argv0= ; argv1= ; argv2= ; argv3= ;,“file1” “x1” “x2” “x3”,4,所指类型为指针, 一般用来表示一个指针数组的首地址。,10.6 多级指针,3,3,3,定义 含义,int *p;,int fun(char *p),int (*p)n;,int *pn;,char *p(形参),int (*p)();,int *p;,指针变量,指针做形式参数,数组指针:指针指向一个数组,指针数组:数组元素为指针,函数的返回值为指针,函数指针:指针指向一个函数入口,指向指针的指针,一、有关指针的数据类型(七种),小 结,二、使用方式,(1) 定义 (2) 赋初值:赋地址& 在使用指针变量前,必须先赋初值 (3) 操作 : 地址操作(行列) 内容操作(间接访问

温馨提示

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

评论

0/150

提交评论