C语言程序设计:项目8 指针_第1页
C语言程序设计:项目8 指针_第2页
C语言程序设计:项目8 指针_第3页
C语言程序设计:项目8 指针_第4页
C语言程序设计:项目8 指针_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、项目8 指针,1,项目导读 项目目标 项目任务,指针是C语言最具特色的语言成分,它是C语言的精华,同时又是C语言的难点。 用好指针会提高C语言程序的运行效率,指针用得不好则会带来麻烦。因此,掌握和运用好指针是学好C语言的关键,项目导读,学会使用指针间接访问变量。 掌握指针递增、递减的运算规则。 学习如何使用具有指针类型的参数的函数来解决问题。 使用一个函数改变另一个函数中局部变量的值,思考,项目目标,任务8.1 指针变量,1.什么是指针 指针是一种特殊的变量,它的特殊性表现在类型和值上。首先看看指针的值,指针的值是某个对象(例如变量)的内存地址,因此指针是用来存放某个对象地址的变量,它存放了哪

2、个对象的地址值,就说它是指向哪个对象的指针。 再看看指针的类型,指针的类型是它所指向的对象的类型,而不是它本身的类型,它本身存放的是地址值。指针可以指向任一类型的对象,于是指针的类型可以是各种各样的。例如,有指向int型、float型、double型、char型的,还有指向数组、结构、联合等构造类型的,还有指向函数、文件以及指向指针的等等,可以说C语言中几乎处处都与指针有联系,任务8.1 指针变量,2.指针变量的定义 指针变量定义的一般形式如下: 类型标识符 *指针变量名: 定义中指针变量名和一般变量一样,用标识符表示。为了与一般变量相区别,在变量名 前加一个“*”.这里“*”作为说明符,说明

3、其后的变量是指针变量。类型标识符表示该指 针变量所指向的对象或变量的类型。例如: int*pi; /*pi是指向int型变量的指针*/ float*pf; /* pf是指向float型变量的指针*/ double *pd: /*pd是指向double型变量的指针*,任务8.1 指针变量,3.指针的运算 (1) 指针运算符 C语言为指针专门设置了二个运算符。 取地址运算符 /*a现在为0*,任务8.1 指针变量,2)指针的赋值 指针可以用某个变量的地址赋位 例如: int a.*pa; 定义了一个整型变量a和一个指向整型变量的指针pa.但这时指针pa并未指向某一具体的整型变量。可以取a的地址赋给

4、pa: pa= 这时指针pa和pb都将指向同一个变量a,任务8.1 指针变量,指针可以加减一个整数 指针可以加减一个整数,并不是地址量与整数值的简单相加。一个指针加一个整数意味 着将指针后移:减去一个整数,意味着前移。例如: p+10 指针后移(增加)10个单元 p+ 指针后移1个单元 p-n 指针前移(减少)n个单元 p- 指针前移l个单元 两个同类的指针可以相减 指向类型相同的两个指针可以相减,其结果是两个指针相隔的单元数。 两个同类的指针可以作比较操作 指向同一类型的两个指针可以比较它们的地址值,使用比较运算符: = = != = 比较结果为1(真)或0(假),可用于条件语句和循环语句中

5、作条件判断,任务8.2 指针类型的参数,函数的参数不仅可以是整型、实型、字符型等数据,而且也可以是指针类型。下面编写一个交换两个变量数值的函数,示例8.1 用一般变量作参数,不能实现交换。 #includestdio.h Void swap(); main() int a=5,b=0; printf(“%d,%dn”,a,b); swap(a,b); printf(“%d,%dn”,a,b),void swap(int y) int temp; temp=x; x=y; y=temp; 运行结果: 5,9 5,9,任务8.2 指针类型的参数,示例8.2用指针作参数,实

6、现两值的交换。 #includestdio.h void swap(int*,int*); main() int a=5,b=9; printf(“%d,%dn”,a,b); swap(,void swap(int *px,int *py) int temp; temp=*px; *px=*py; *py=temp; 运行结果: 5, 9 9 , 5,从上例可以看出,虽然C语言的函数参数都是传值的,不能通过形参本身值的改变,直接影响实参的变化,但是可以利用指针作参数,改变它所指向的变量的值(而非形参自身的值),间接地将它们的影响返回到主调函数,任务8.3 指针与数组,8.3.1 指针与数组 C

7、语言中,指针与数组的关系非常密切,任何能由数组下标完成的操作都可由指针来实现,正确地使用数组指针来引用和处理数组元素,能使程序更加简明紧凑,效率更高。 1.一维数组的指针 (1)一维数组指针的定义 如果定义了一个一维数组: int 0; 则该数组的元素为a0, a1, ,a9。如图8.5所示,图8.5,任务8.3 指针与数组,C语言规定,任何一个数组的数组名本身就是一个指针,是一个指向该数组首元素的指针,即首元素的地址值,所以数组名是一个常量指针。这样数组元素的地址可以通过数组名加偏移量来取得,上面一维数组各元素的地址可表示为 a,a+1, ,a+9 而相应的数组元素可表示为 *a,*(a+l

8、),*(a+9) 用数组名(常量指针)表示上述数组,如图8.6所示,图8.6,任务8.3 指针与数组,现在定义一个指针变量p,并将其初始化为a或 这样就把数组a的首地址赋给了指针变量p,或者说P是指向数组a的指针,于是数组a各元素的地址可用指针变量p加偏移量来表示,即 p,p+1, ,p+9 相应的数组元素则为 *p,*(p+1),*(p+9) 用指针变量表示上述数组如图8.7所示,图8.7,任务8.3 指针与数组,2)通过指针引用数组元素 根据上面所述,引用数组元素可以采用: 下标法,如ai形式; 常量指针法,如*(a+i),其中a是数组名; 指针变量法,如*(p+i), p是指向数组的指针

9、变量,初值为a。 2.多维数组的指针 使用指针也能指向多维数组及其元素,但情况稍复杂一些。 (1)指向数组元素的指针变量 如果我们定义了一个二维数组: int a23= 1,2,3, 10,20,30; int *P; p=a0; 这时指针变量p指向了数组a的首地址,通过指针p的移动就可以访问一维数组的每一个元素,任务8.3 指针与数组,示例8.7 用指针变量输出数组元素的值。 #include main() static int a23= 1,2,3, 10,20,30; int *p; for (p=a0;pa0+6;P+) if(p-aO)%3=0) printf(n); printf(

10、%4d,*p); 运行结果 1 2 3 10 20 30,任务8.3 指针与数组,2)指向包含m个元素的一维数组的指针 指向包含m个元素的一维数组的指针定义如下: 类型标识符(*指针变量名)元素个数m; 例如: int(*p)3; 其中,p是一个指针变量,它指向包含3个整数元素的的一维数组。注意*p两边的括号不可省,如写成*p3就成了指针数组了。 当把数组的首地址a赋给p后,即 p=a; 如访问第i行第j列元素,可用 *(*(p+i)+j) 注意:因为p是个指向一维数组的指针,i的增值以一维数组的长度为单位,所以p+i是指第i行,任务8.3 指针与数组,3.字符指针与字符串 C语言中可以用字符

11、数组处理字符串,还可以使用字符指针处理字符串,后者更方便、更灵活。 (1)字符指针的定义与引用 指向字符型数据的指针称为字符指针,如 char *p; 定义了一个指向字符型的指针变量p。可以使字符指针指向一个字符数组,然后通过该指针处理字符数组中的字符串。 (2)字符指针作函数参数 把一个字符串从一个函数传递到另一个函数可以利用字符数组名或字符指针作参数,它们在调用时传递的是地址。在被调函数中对字符串处理以后,其任何变化都会反映到主调函数中,任务8.3 指针与数组,8.3.2 指针数组 1.指针数组的定义 一个数组,它的各个元素都是指针,这种数组称为指针数组。其定义方式如下: 类型标识符 *数

12、组名元素个数; 例如: char *p5; 其中,p是数组名,包含5个元素,每个元素都是字符指针。 在定义指针数组时,也可以进行初始化,如: static char *p5= Pascal, C,Fortran,Basic ,Ada,任务8.3 指针与数组,2.用指针数组处理多维数组 在C语言程序设计中,指针数组常用来处理多维数组的数据。例如一个二维数组 int a34; 可以看作是以a0、a1、 a2为首地址的3个一维数组,每个一维数织有4个元素。可以定义指针数组 int *pa3; 把a数组的3个首地址分别赋给pa的3个元素: pa0=a0; pa1=a1; pa2=a2; 这样pa中的三

13、个元素就分别指向了三个一维数组。之后,就可以通过这三个指针引用二维数组的各个元素,aij和*(ail+)、 *(pai+j)和pij是完全等价的,任务8.4 指针与函数,8.4.1指针与函数 指针与函数的关系体现在三个方面: 指针可以作为函数的参数,用来将一个变量的地址传递给函数; 函数的返回值可以是指针; 指针可以指向函数。 1.返回指针值的函数 函数具有以定的类型,也就是返回值的类型。函数可以返回整型、实型、字符型等数据,也可以返回同指针类型数据,这时函数定义的一般形式如下: 类型标识符 *函数名(参数表) 例如: int *f(int x,int y) 其中,f是函数名,调用它以后返回一

14、个指向整型的指针。x, y是函数f的形参,*表示其后的函数f()是指针型函数(函数值是指针),最前面的int表示返回的指针指向整型变量,任务8.4 指针与函数,2.指向函数的指针 C语言中不仅普通的变量、数组和字符串有指针,函数也有指针。程序中的每一个函数经编译后,其目标代码在内存中是连续存放的,该代码的开始地址就是函数的入口地址。C语言规定,函数名本身代表函数的入口地址。可以通过函数名来直接调用该函数,也可以通过指向该函数的指针来间接调用该函数。函数指针的定义如下: 类型标识符(*函数指针变量名)(): 例如: int(*P)(); 其中,p为指向函数的指针变量,该函数返回一个整型值。注意:

15、*p两侧的圆括号不可省,否则就成了“int *p();”,这样就把p说明成一个返回指针值的函数了。下面通过一个简单程序来说明。在此用指向函数的指针来调用该函数,任务8.4 指针与函数,8.4.2 指向指针的指针 如果定义了一个变量,如 int i=10; 这时要访问变量i的值,可通过变量i直接访问。也可以定义一个指针变量p,使其指向i: int *p= pp指向指针p,前面有两个*,是指向指针的指针,通过pp可以访问指针p和最终数据i,如图8.15所示,任务8.4 指针与函数,8.4.3 应用举例 示例8.21 设计字符串部分复制函数,要求将第一个字符串从第m个字符开始的全部字符复制为第二个字符串,include #include void str_copy(char *,char*,int); main(

温馨提示

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

评论

0/150

提交评论