C语言课件第6章指针_第1页
C语言课件第6章指针_第2页
C语言课件第6章指针_第3页
C语言课件第6章指针_第4页
C语言课件第6章指针_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1 作业:作业:4 4,6 6,1313,(,(1515,1818) 要求写画出要求写画出1515,1818流程图,上机调试流程图,上机调试 3.4 3.4 指针指针指针指针 主要内容主要内容: : 1 1 指针的概念指针的概念 2 2 指针的定义和使用指针的定义和使用 3 3 指针的指针的基本操作基本操作 4 void4 void指针和指针和constconst指针指针 5 5 动态内存分配动态内存分配 2 指针的概念指针的概念 数据在内存中是如何存取的? 系统根据程序中定义变量的类型,给变量分配一定的长度 空间。字符型占 数据在内存中是如何存取的? 系统根据程序中定义变量的类型,给变量分配一定的长度 空间。字符型占1个字节,整型数占个字节,整型数占4个字节个字节.。内存区的 每个字节都有编号,称之为 。内存区的 每个字节都有编号,称之为地址地址。 2000H 2001H 2002H 2003H 2004H 3 5 内存内存 内存单元 的地址 内存单元 的地址 内存单元 的内容 内存单元 的内容 1.1.指针的概念指针的概念指针的概念指针的概念 指针指针指针指针(PointerPointer)变量变量变量变量 是一种特殊的变量,变量中存放的不是某种数据类型的是一种特殊的变量,变量中存放的不是某种数据类型的是一种特殊的变量,变量中存放的不是某种数据类型的是一种特殊的变量,变量中存放的不是某种数据类型的 数据,而是另一个变量或常量的地址。数据,而是另一个变量或常量的地址。数据,而是另一个变量或常量的地址。数据,而是另一个变量或常量的地址。简称为指针简称为指针简称为指针简称为指针 指针的定义指针的定义指针的定义指针的定义 语法形式如下:语法形式如下: 数据类型数据类型数据类型数据类型 * *指针变量名指针变量名指针变量名指针变量名 c+c+中下面两种指针的表示法是等价的:中下面两种指针的表示法是等价的:中下面两种指针的表示法是等价的:中下面两种指针的表示法是等价的: char *name char *name char * name char * name 第二种一般用在函数原形中,即只知类型,而不知变量且第二种一般用在函数原形中,即只知类型,而不知变量且第二种一般用在函数原形中,即只知类型,而不知变量且第二种一般用在函数原形中,即只知类型,而不知变量且 不必指出变量名时的情形不必指出变量名时的情形不必指出变量名时的情形不必指出变量名时的情形 3 例如:例如: intint *p1;*p1; static static intint *p2;*p2; char *char *dada; ; 上面定义了名为上面定义了名为p1p1,p2p2和和dada的三个不同类型指针。的三个不同类型指针。 注意:注意: 符号符号“ “* *” ” 说明其后的变量是指针变量,但千万不要认为说明其后的变量是指针变量,但千万不要认为“ “* *p p” ”是是 指针变量,指针变量是指针变量,指针变量是p p而不是而不是* *p p。 通常把指针指向的变量的数据类型称为指针的数据类型;而通常把指针指向的变量的数据类型称为指针的数据类型;而 任何一个指针变量本身数据值的类型都是任何一个指针变量本身数据值的类型都是unsigned long unsigned long intint。 MM 150150 value ch pv pc *pv *pc 内存空间 1000H 1050H 0000H char ch=M; int*py,*pc; 并执行赋值语句:并执行赋值语句:并执行赋值语句:并执行赋值语句: pv= pc= 由于由于pv中存放的是中存放的是value变量的地址,变量的地址,pc中存放的是中存放的是ch变量的地址,称变量的地址,称pv和和pc为指针 变量。简称为指针( 为指针 变量。简称为指针(Pointer)。)。 4 空指针空指针空指针空指针: 地址值为地址值为 0 0,专用于表示未指向任何数据;,专用于表示未指向任何数据;地址值地址值 0 0 可用可用 NULL NULL 表示;表示; 无类型指针(无类型指针(无类型指针(无类型指针(void void 指针)指针)指针)指针): 无类型限制的指针,可以用来指向任何类型的数据。无类型限制的指针,可以用来指向任何类型的数据。 ?具有相同存储类型和数据类型的指针可以在一行中说具有相同存储类型和数据类型的指针可以在一行中说 明,它们也可以和同类型的普通变量在一起说明。明,它们也可以和同类型的普通变量在一起说明。 例如:例如: intint *p1, *p2, *p3;*p1, *p2, *p3; char m, *char m, *dada; ; 在上例中,第一行声明了三个在上例中,第一行声明了三个intint型指针型指针p1p1,p2p2, p3p3;第二行声明了一个;第二行声明了一个charchar型变量型变量mm和一个指针和一个指针dada。 定义了一个指针后,在使用此指针前,必定义了一个指针后,在使用此指针前,必 须首先给它赋一个合法的值。方法须首先给它赋一个合法的值。方法: : 可以在定义指针的同时,通过初始化来给指针可以在定义指针的同时,通过初始化来给指针 赋值,赋值, 可以在使用之前给指针赋值。可以在使用之前给指针赋值。 ?指针的初始化指针的初始化。 指针初始化的一般形式是指针初始化的一般形式是 : 数据类型数据类型数据类型数据类型 * *指针名指针名指针名指针名= =初始地址值;初始地址值;初始地址值;初始地址值; 2.2.指针的使用指针的使用指针的使用指针的使用 5 例例1 1: intint a,*pa=a,*pa= 将变量将变量a a 的内存地址作为初始值赋予的内存地址作为初始值赋予intint型指针型指针papa。 上面这种写法与下面的写法是等价的:上面这种写法与下面的写法是等价的: intint a;a; intint *pa=*pa= “ “ /n,*p1; /定义指针定义指针p1p1时没有初始化时没有初始化 p1= /p1= /给指针给指针p1p1赋值为赋值为intint型变量型变量n n的地址的地址 或者:或者: intint n,*p1=0; /n,*p1=0; /定义指针定义指针p1p1时初始化为时初始化为0 0 p1= p1= /给指针给指针p1p1赋值为赋值为intint型变量型变量n n的地址的地址 都是正确的。都是正确的。 6 ?可以向一个指针赋初值为另一个指针变量可以向一个指针赋初值为另一个指针变量,即把另一个,即把另一个 已经初始化的指针赋予一个指针。已经初始化的指针赋予一个指针。这两个指针指向同一这两个指针指向同一 变量的内存地址。变量的内存地址。 例如:例如: intint n;n; intint *p1= /*p1= /指针指针p1p1的值初始化为变量的值初始化为变量n n的地址的地址 intint *p2=p1; /*p2=p1; /指针指针p2p2的值初始化为指针变量的值初始化为指针变量p1p1 上面这种写法与下面的写法是等价的:上面这种写法与下面的写法是等价的: intint n;n; intint *p1= /*p1= /指针指针p1p1的值初始化为变量的值初始化为变量n n的地址的地址 intint *p2= /*p2= /指针指针p2p2的值初始化为变量的值初始化为变量n n的地址的地址 2.2.指针的使用指针的使用 ?可以定义一个指针指向数组可以定义一个指针指向数组。由于数组名表示的。由于数组名表示的 是该数组的首地址,则如下例声明:是该数组的首地址,则如下例声明: intint a10,*pa=a;a10,*pa=a; 指针指针papa指向数组的第一个元素所在地址值。指向数组的第一个元素所在地址值。 上述声明方式与下面的语句等价:上述声明方式与下面的语句等价: intint a10,*pa=a10,*pa= “ “a=1,*pa= coutcout void main( )void main( ) intint iCountiCount=18;=18; intint * *iptriptr= /; /定义指针变量定义指针变量iptriptr, ,并将并将iCountiCount; ; 地址做初值地址做初值 coutcout* *iptriptrendlendl; ; * *iptriptr=58; /=58; /将指针变量所指值重新赋值将指针变量所指值重新赋值 coutcouti iCountCountendlendl; ; coutcoutiptriptrendlendl; /; /输出地址输出地址 coutcout /; /输出地址输出地址 coutcout* *iptriptrendlendl; /; /输出值输出值 coutcout /; /输出地址输出地址 程序运行结果程序运行结果: : 1818 5858 0x0065FDF40x0065FDF4 0x0065FDF40x0065FDF4 5858 0x0065FDF00x0065FDF0 0x0065FDF458 0X0065FDF0 Iptr0X0065FDF4 iCount 变量与指针变量的关系变量与指针变量的关系 3.3.指针的基本操作指针的基本操作 指针赋值:指针赋值:操作符操作符 = = 同类型指针之间可以互相赋值同类型指针之间可以互相赋值 任何类型的指针可赋值给任何类型的指针可赋值给voidvoid指针,但反指针,但反 过来却不行,例如:过来却不行,例如: char c=char c= X X ,*s; s=,*s; s= void *p1,*p2=NULL;void *p1,*p2=NULL; p1=s; /p1=s; /允许允许 s=p2; /s=p2; /不允许不允许 9 3.3.指针的基本操作指针的基本操作 取变量的地址:取变量的地址:操作符操作符 k,*p; p= /pp= /p指向变量指向变量k k 上面两个语句可以合并成一个:上面两个语句可以合并成一个: intint k,*p= /pk,*p= /p指向变量指向变量k k 3.3.指针的基本操作指针的基本操作 指针移动:指针移动:移动移动 1 1 个单位个单位 格式:格式: +指针指针变量变量指针指针变量变量+ -指针指针变量变量指针指针变量变量- 执行执行 intint k,*k,*pkpk= coutcoutendlendl+pkpk; ; coutcoutendlendlpkpk; ; 显示的是两个相同的地址显示的是两个相同的地址 10 4. 4. 指针运算指针运算 指针运算是以指针变量所持有的地址值为运算指针运算是以指针变量所持有的地址值为运算 量进行的运算。因此,指针运算的实质是地址的量进行的运算。因此,指针运算的实质是地址的 计算。计算。 指针的算术运算指针的算术运算指针的算术运算指针的算术运算 指针的算术运算是按指针的算术运算是按C+C+语言地址计算规则进语言地址计算规则进 行的,与地址中存放的数据长度有关。行的,与地址中存放的数据长度有关。 设设pxpx和和pypy是指向具有相同数据类型的一组若是指向具有相同数据类型的一组若 干数据的指针,干数据的指针,n n是整数,则指针可以进行的算术是整数,则指针可以进行的算术 运算有如下几种:运算有如下几种: px+npx+n,pxpx- -n n,pxpx+,+pxpx, pxpx- -,- -pxpx,pxpx- -pypy 11 1. 1. 指针与整数的加减运算:(指针与整数的加减运算:(指针与整数的加减运算:(指针与整数的加减运算:(px+npx+n,pxpx- -n n) 指针作为地址量加上或减去一个整数指针作为地址量加上或减去一个整数n n,其意义是指其意义是指 针当前指向位置的前方或后方针当前指向位置的前方或后方第第n n个数据的位置。个数据的位置。由于指由于指 针可以指向不同数据类型,即数据长度不同的数据,所针可以指向不同数据类型,即数据长度不同的数据,所 以这种运算的结果值取决于指针指向的数据类型以这种运算的结果值取决于指针指向的数据类型 p+np+n的实际操作是:(的实际操作是:(p p)+n*+n*sizeofsizeof(数据类型);(数据类型); p p- -n n的实际操作是:(的实际操作是:(p p)- -n*n*sizeofsizeof(数据类型);(数据类型); (p p)表示指针)表示指针p p中的地址值,而不是中的地址值,而不是 p= +, - -, * 优先级相同,都是右结合性。优先级相同,都是右结合性。 7 7 5 5 3 3 2008H2008H2004H2004H2000H2000H a 13 例:例: 字符串复制函数。字符串复制函数。 strcpy(sstrcpy(s, t), t) char *s, *t;char *s, *t; while(*s+=*t+)!=while(*s+=*t+)!= 0 0 ; 这是标准函数库中的一个函数,函数体中使用了这是标准函数库中的一个函数,函数体中使用了 指针后置运算:指针后置运算:( (*s+=*t+)!=*s+=*t+)!= 00 它的运算过程是把它的运算过程是把t t的目标变量的值赋予的目标变量的值赋予s s的目标变的目标变 量,然后判断赋值表达式的结果值,即赋的值是否等量,然后判断赋值表达式的结果值,即赋的值是否等 于于 0 0 。s s和和t t的值使用后执行加的值使用后执行加1 1运算,分别指向下一个运算,分别指向下一个 目标。函数中循环体是空语句。目标。函数中循环体是空语句。 int a=3, *p; p= +, - -, * 优先级相同,都是右结合性。优先级相同,都是右结合性。 7 7 5 5 3 3 2008H2008H2004H2004H2000H2000H a p= +, - -, * 优先级相同,都是右结合性。优先级相同,都是右结合性。 相当于相当于a+。表达式为。表达式为3, a=4 7 7 5 5 3 3 2008H2008H2004H2004H2000H2000H a 4 int a=3, *p; p= +, - -, * 优先级相同,都是右结合性。优先级相同,都是右结合性。 7 7 5 5 3 3 2008H2008H2004H2004H2000H2000H a x5,a; intint * *pxpx= a=a=pypy- -pxpx; ; 这里的变量这里的变量a a就表示数组元素就表示数组元素x1x1和和x4x4之间相隔的元素的个之间相隔的元素的个 数。数。 16 指针的关系运算指针的关系运算指针的

温馨提示

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

评论

0/150

提交评论