C语言程序设计 课件 任务4.2 指针_第1页
C语言程序设计 课件 任务4.2 指针_第2页
C语言程序设计 课件 任务4.2 指针_第3页
C语言程序设计 课件 任务4.2 指针_第4页
C语言程序设计 课件 任务4.2 指针_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计基础与实践模块四编程高级应用任务4.2指针C语言程序设计基础与实践课程组04技能点拓展03技能点详解02技能点分析目录CONTENTS任务4.2指针01问题引入05技能点检测一问题引入现实生活中,我们总会碰到很多指示牌,它们的作用是告诉寻路者要找到一个地方应该怎么走,以便我们找到自己的目的地或者所需的东西,比如车站出口、物品摆放地等等。在程序设计中,有时也需要“指示牌”,告诉程序所需要的数据、代码在哪,以便于更好的调用数据、代码。那么指针在使用时我们应该注意哪些事项呢?04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针二技能点分析1.指针概念2.指针运算3.指针与数组学习目标1.什么是指针?2.如何声明指针?3.指针的算术运算有哪些?4.什么是指针数字?如何定义一维指针数组?学期预习04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type*v_name;type是指针的基类型,它必须是一个有效的C数据类型,v_name是指针变量的名称。用来声明指针的星号*与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。int*intp;/*一个整型的指针*/double*doup;/*一个double型的指针*/float*flop;/*一个浮点型的指针*/char*chp;/*一个字符型的指针*/三技能点详解——指针不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。例如一个int型变量inta:编译器会根据变量inta的类型int,为其分配4个字节地址连续的存储空间。假如这块连续空间的首地址为0x0048EFAA,那么这个变量占据0x0048EFAA~0x0048EFAD这四个字节的空间,0x0048EFAA就是变量inta的地址。三技能点详解——指针三技能点详解——1指针的算术运算1)取址运算符在程序中定义变量时系统会为变量在内存中开辟一段空间,用于存储该变量的值,每个变量的存储空间都有唯一的编号,这个编号就是变量的内存地址。C语言支持以取址运算符“&”获得变量的地址。&符号的使用方法:&vary_name;intinta=99;//定义变量intaint*intp=&inta;//定义int类型的指针intp,并取变量inta的地址赋值给intp三技能点详解——1指针的算术运算2)取值运算符指针变量存储的数值是一个地址,直接对地址操作容易出错,针对指针变量的取值并非取出它所存储的地址,而是间接取得该地址中存储的值。C语言支持通过使用一元运算符*来返回位于操作数所指定地址的变量的值。*符号使用方法:*指针表达式。案例如下:通过上述代码,最终实现变量intb的值也是99。其效果等同于intb=inta。intinta=99;//定义变量intaint*intp=&inta;//定义int类型的指针intp,并取变量inta的地址赋值给intpintintb=*intp;//定义int型变量intb,并取指针变量p中存储的变量值赋给intb三技能点详解——1指针的算术运算3)指针的算术运算C指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。指针的每一次递增,它其实会指向下一个元素的存储单元。指针的每一次递减,它都会指向前一个元素的存储单元。指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如int型就是4个字节,char型就移动1个字节。3)指针的比较指针可以用关系运算符进行比较,如==、<和>。如果intp1和intp2指向两个相关的变量,比如同一个数组中的不同元素,则可对intp1和intp2进行大小比较。三技能点详解——1指针的算术运算1)指针与一维数组定义了指向数组的指针,则指针可以像使用数组名一样,使用下标取值法对数组中的元素进行访问,指针还可以通过“*”符号访问数组元素,还可以直接移动指针访问数组中的数据。三技能点详解——2指针与数组charcha1[6]="hello";//定义一个字符数组,长度为6,hello后还要有一个/0字符char*chp,t; //定义一个chp字符指针和字符型变量tchp=cha1; //将数组地址赋值给指针chpt=chp[4]; //通过下标访问字符数组中的’o’字符,赋值给字符变量tt=*(p+4)//不移动指针,通过指针运算访问数组元素’o’字符

/***************************************移动指针,通过指针p+4后指向数组元素’o’字符,*然后通过*取值运算符访问字符****************************************/p=p+4;t=*p;2)指针与二维数组在二维数组arr中,arr[0]就表示第一行数据,arr[1]表示第二行数据。arr[0]、arr[1]相当于二维数组中一维数组的数组名,指向二维数组对应行的第一个元素,arr[0]=&arr[0][0],arr[1]=&arr[1][0]。在二维数组中,arr+i虽然指向的是该行元素的首地址,但它代表的是整行数据元素,只是一个地址,并不表示某一元素的值。*(arr+i)仍然表示一个地址,与arr[i]等价。*(arr+i)+j表示二维数组元素arr[i][j]的地址,等价于&arr[i][j],也等价于arr[i]+j。三技能点详解——2指针与数组通过ptr访问二维数组arr中的第2行第2列的元素:ptr[1][1]*(ptr[1]+1)*(*(ptr+1)+1)案例4.1.1一维数组指针/*******************************************内容简述:在程序中经常看到使用指针代替数组,*因为变量指针可以递增,而数组不能递增,数组*可以看成一个指针常量。下面的程序递增变量指*针,以便顺序访问数组中的每一个元素******************************************/#include

<stdio.h>intmain(){

intarr[]={100,200,300};

inti,*ptr;ptr=arr; /*指针中的数组地址*/

for(i=0;i<3;i++){printf("地址值:arr[%d]=%p\n",i,ptr);printf("存储值:arr[%d]=%d\n",i,*ptr);ptr++; /*通过自增运算让指针指向下一个位置*/}

return0;}三技能点详解——案例实例4.1.2二维数组指针通过指针数组p和一维数组a构成一个3×2的二维数组,并为a数组赋初值2、4、6、8、…。要求先按行的顺序输出此“二维数组”,然后再按列的顺序输出它。/****************************************内容简述:利用数组指针访问二维数组**************************************/#include

<stdio.h>intmain(){inti,j,a[3][2]={2,4,6,8,10,12},*p[3];//定义一个指针数组*p[]

for(i=0;i<3;i++) p[i]=a[i];//利用指针p[i]获取每行数组a[i]的地址

for(i=0;i<3;i++){for(j=0;j<2;j++) printf("%4d",p[i][j]);printf("\n");}

for(i=0;i<2;i++){for(j=0;j<3;j++)

printf("%4d",p[j][i]);printf("\n");}}三技能点详解——案例04技能点拓展03技能点详解02技能点分析目录CONTENTS01问题引入05技能点检测任务4.2指针四技能点拓展——1NULL指针在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个NULL值是一个良好的编程习惯。赋为NULL值的指针被称为空指针。NULL指针是一个定义在标准库中的值为零的常量。在大多数的操作系统上,程序不允许访问地址为0的内存,因为该内存是操作系统保留的。然而,内存地址0有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。如需检查一个空指针,您可以使用if语句,如下所示:if(ptr)/*如果ptr非空,则完成后续操作*/if(!ptr)/*如果ptr为空,则完成后续操作*/四技能点拓展——2指向指针的指针指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向int类型指针的指针:int**vptr;四技能点拓展——3

无类型指针使用void*修饰的指针。无类型指针指向一块内存,但其类型不定,程序无法根据这种定义确定为该指针指向的变量分配多少存储空间,所以若要使用该指针为其他基类指针赋值,必须先转换成其他类型的指针。void *p1=NULL,*q1;//定义一个无类型的指针变量int *m1=(int*)p1;//将无类型的指针变量p强制转换为int*型再赋值四技能点拓展——3

案例1

/****************************************在程序中经常看到使用指针代替数组,因为变量*指针可以递增,而数组不能递增,数组可以看成*一个指针常量。下面的程序递增变量指针,以便*顺序访问数组中的每一个元素***************************************/#include

<stdio.h>intmain(){

intarr[]={100,200,300};

inti,*ptr;ptr=arr; /*指针中的数组地址*/

for(i=0;i<3;i++){printf("地址值:arr[%d]=%p\n",i,ptr);printf("存储值:arr[%d]=%d\n",i,*ptr);ptr++; /*通过自增运算让指针指向下一个位置*/}

return0;}四技能点拓展——3

温馨提示

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

评论

0/150

提交评论