C语言程序设计 教学课件 作者 刘国成 张丹彤第八章 指针_第1页
C语言程序设计 教学课件 作者 刘国成 张丹彤第八章 指针_第2页
C语言程序设计 教学课件 作者 刘国成 张丹彤第八章 指针_第3页
C语言程序设计 教学课件 作者 刘国成 张丹彤第八章 指针_第4页
C语言程序设计 教学课件 作者 刘国成 张丹彤第八章 指针_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计教程 计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就称为内存地址。内存的存储空间是连续的,内存的地址号也是连续的。一个变量实质上代表了“内存中的某个存储单元”。每个变量所占的存储单元都有确定的地址。具体的地址是在编译时分配的。若有定义inta,b;floatx则系统为变量a,b,x分配内存空间情况如图所示。对指针变量的定义包括三个内容:(1)指针类型说明,即定义变量为一个指针变量;(2)指针变量名;(3)变量值(指针)所指向的变量的数据类型。其一般形式为:•类型说明符*变量名; 指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。 在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。两个有关的运算符:①&:取地址运算符。②*:指针运算符(或称“间接访问”运算符)。C语言中提供了地址运算符&来表示变量的地址。其一般形式为:•&变量名; 如&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。 设有指向整型变量的指针变量p,如要把整型变量a的地址赋予p可以有以下两种方式:(1)指针变量初始化的方法inta;int*p=&a;(2)赋值语句的方法inta;int*p;p=&a;指针变量可出现在表达式中,设•intx,y,*px=&x;• 指针变量px指向整数x,则*px可出现在x能出现的任何地方。例如:•y=*px+5;/*表示把x的内容加5并赋给y*/• 注意:当指针运算符与自加、自减运算符相邻出现在表达式时需按右结合方法确定优先级别。 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。下面通过例子来说明。例8.5:#include<stdio.h>voidmain(){voidmov(int*,int*);intx,y;mov(&x,&y);printf("%d,%d\n",x,y);}voidmov(int*px,int*py){*px=10;*py=20;}运行情况:10,208.6.1一维数组指针的概念 变量有地址,数组包含若干元素,每个数组元素都在内存中占用存储单元,且是连续的存储单元,也有相应的地址。指针变量可以指向变量,自然也可以指向数组和数组元素。数组元素的指针就是数组元素的地址。。下面通过例子来说明。8.6.2数组元素地址作实参 当调用函数时,数组元素可以作为实参传给形参,和普通变量一样,对应的形参必须是类型相同的变量。数组元素的值可以传送给该变量,在函数中只能对该变量进行操作,而不能直接引用对应的数组元素。当数组元素的地址作为实参时,因为是地址值,所以对应的形参也应当是基类型相同的指针变量。8.6.3数组名作函数参数 指针可以作参数,数组名表示数组的首地址,所以数组名可以作函数参数。归纳起来,如果有一个实参数组,要在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种情况:①形参和实参都用数组名;②实参用数组名,形参用指针变量;③实参形参都用指针变量;④实参为指针变量,形参为数组名。 应注意,如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的数组。8.7.1二维数组地址的概念 在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的每个成员又是一个一维数组。8.7.2通过建立一个行指针来引用二维数组元素若有以下定义:•inta[3][4],(*ptr)[4]; 在这里,说明符(*ptr)[4]中,由于一对圆括号的存在,所以*号首先与ptr结合,说明ptr是一个指针变量,然后再与说明符[4]结合,说明指针变量ptr的基类型是一个包含有四个int元素的数组。在这里,ptr的基类型与a的相同,因此ptr=a;是合法的赋值语句。8.7.3二维数组名作为实参时,实参和形参之间的数据传递 当二维数组名作为实参时,对应的形参必须是一个行指针变量。在fun函数的首部可以是以下三种形式之一:(1)fun(double(*a)[N])(2)fun(doublea[][N])(3)fun(doublea[M][N]) C语言本身没有设置一种定义字符串的变量,字符串的存储完全依赖于字符数组,但字符数组又不等于字符串变量。 用字符数组和字符指针变量都能实现字符串的存储和运算,但它们之间是有区别的,主要有以下几点: (1)字符数组由若干个元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址(字符串的首地址)。不是将字符串放到字符指针变量中。 (2)赋值方式不同。字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值(3)赋初值时,对以下的变量定义和赋初值:char*a="Iamastudent!"; (4)在定义一个数组时,在编译时已分配内存单元,有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以存放一个地址值,该指针变量可以指向一个字符型数据,但为对它赋值,它则未指向具体的字符数据。8.9.1指针数组的定义及引用 一个数组,如果其每个元素的类型都是整型的,那么这个数组称为整型数组;如果每个元素都是指针类型的,则它就是指针数组。也就是说,指针数组用来存放一批地址的。指针数组的定义形式:•类型标识*数组名[数组长度说明]•例如:•int*p[4]8.9.2指针数组作为实参时,实参和形参之间的数据传递当指针数组作为实参时,对应的形参应当是一个指向指针的指针。例如,若主函数中有以下定义和函数调用语句:•#defineM5#defineN3main(){double

s[M][N],

*ps[M];•for

(i=0;

i<M;

i++)

ps[i]=s[i];fun

(ps);•}指针数据的指针变量,简称指向指针的指针。 我们还可以设置一个指针变量p,它是指向指针型数据的指针变量。定义一个指向指针数据的指针变量如下:•char**p;• p的前面有两个*号。*运算符结合性是从右到左,因此**p相当于*(*p),显然*p是指针变量的定义形式。 指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式:•main()•括号中是空的。实际上,main函数可以有参数,例如:•main(argc,argv)• 其中argc和argv是main函数的形参。main函数是由系统调用的。8.12.1指向函数的指针变量 一个函数包括一系列的指令,在内存中占据一片存储单元,它有一个起始地址,即函

温馨提示

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

评论

0/150

提交评论