您好,欢迎访问三七文档
掌握指针、指针变量的概念以及它们之间的区别;掌握指针变量的定义,指针变量参加的各种运算;掌握数组的指针,指向数组的指针的概念,定义形式,区别以及对它们的引用;掌握字符串的指针,指向字符串指针的概念,表示形式以及引用;掌握指针数组的概念、定义;熟悉函数的指针和指向函数的指针变量的概念、定义格式;本章的教学目标第十章指针本章的教学重点:指针的定义、引用和运算方法数组、函数和字符串与指针的关系指针变量的引用指针作为函数参数的运用本章的教学难点:教学内容一指针的概念;二指针变量;三指针与数组;四指针与字符串;五指针与函数;六指向指针的指针;七指针的数据类型小结;预备知识内存:就是内部存储器,是由存储单元组成的。它的特点是存储单元是线性连续的。存储单元的最小单位是字节。1.内存的概念地址:为了访问内存中的某个存储单元,我们要为它编号,这种编号称为内存地址。通过地址我们就能够访问该地址所标识的存储单元。2.地址的概念变量的地址:变量在内存中总占用几个连续的字节,开始字节的地址,就是变量的地址。2007存储单元一指针的含义指针:一个变量的地址称为该变量的指针。指针的对象:当把变量的地址存入指针变量后,我们就可以说这个指针指向了该变量。变量的存取方法:直接存取和间接存取。直接存取:直接根据变量名存取数据。间接存取:通过指针变量存取相应变量的数据。二指针变量一、指针变量的概念指针变量:若一个变量专用于存放另一个变量的地址(指针),则该变量称为指针变量。二、指针变量的定义一般形式:类型标识符*变量名;例如:int*ptr1,*ptr2;指针变量的类型:指明了该指针指向的内存空间所存储的数据类型。在定义指针变量时要注意以下几个问题:⑴变量名ptr2前面的“*”不能省略,如果写成int*ptr1,ptr2;则ptr2被定义为整型变量,而非整型指针变量。⑵定义中的“*”表示所定义的变量是指针变量,但指针变量名是ptr1、ptr2,而非*ptr1、*ptr2。⑶指针变量只能指向定义时所规定类型的变量。这个规定的类型称为该指针变量的“基类型”。如:上例中ptr1、ptr2只能指向整型变量,不能指向实型或字符型变量。其“基类型”相同,都是整型。⑷定义指针变量后,并未确定该变量指向何处。也就是说该变量的值是不确定的。在引用指针变量前必须首先让它指向一个变量,这一点非常重要。首先介绍指针运算符(&,*)“&”(地址运算符):取变量的存储地址。“*”(引用运算符):是取指针所指向变量的内容。例如:&a是求变量a的地址。ptr指向了i变量,*ptr表示i的值,即3说明:⑴在定义指针变量时,可以立即将一个地址值赋给指针变量,这就是指针变量的初始化。指针变量的初始化也是指针的赋值运算。如:floatflt,*f_ptr=&flt;注意:这不是给*f_ptr赋值。⑵指针变量间的赋值和引用应保证基类型相同。若有定义:int*p,i;float*q,x;则:q=&i;╳p=&x;╳我们还可以用这种方法实现对变量的改变:*ptr=15;等价于i=15;由此可见:通过指针运算符“*”可以引用一个变量。如:当ptr已经指向变量i后,*ptr就等同于i。进一步理解“&”和“*”:“&”运算和“*”运算是一对互逆运算。&*ptr&iptr*&i*ptri等价于三、指针变量赋值与初始化指针变量赋值后,指针变量就指向一个确定的内存存储单元。使用指针的赋值运算(=)对指针变量赋值⑴使用取地址运算符,把地址值赋值给指针变量。如:inti,*pi;pi=&i;⑵把指针变量的值赋给另一个指针变量。如:inti,*pa,*pb;pa=&i;pb=pa;⑶给指针变量赋值为符号常量NULL。说明:NULL是一个空指针,表示该指针变量的值没有意义。作用是为了避免对没有被初始化的指针变量的非法引用。NULL的定义在“stdio.h”中。如:int*pi;pi=NULL;•指针的加减运算(+、-)•指针的自加自减运算(++,--,+=,-=)1.指针的+、-运算指针±整数指针-指针+、-说明:⑴指针与整型值加减的结果是指针,表示使该指针指向该指针下移或上移存储单元个数(整型值)之后的内存地址。存储单元的大小就是该指针的数据类型所需的内存大小。例如:ptr+n(指针ptr,n为整数)这个指针值代表的内存单元的地址是:ptr+n*d(其中d是指针所指向变量的数据类型所占内存字节数),即指针移动了n个元素。四、指针的算术运算符⑵指针与指针的加运算毫无意义,所以指针与指针没有加运算。⑶指针与指针的减运算要求相减的两个指针属于同一类型,其结果是整数,表示两个指针之间的数据的个数。其结果值的计算公式是:ptr1-ptr2=(ptr1的值-ptr2的值)/指针的数据类型所占的字节数例如:int*ptr1,*ptr2,*ptr3,x;intary[5]={2,4,8,16,32};ptr1=&ary[0];ptr2=&ary[3];ptr3=ary;x=ptr2-ptr1;x的值是32.指针的++、--、+=、-=运算++、+=:是移动指针到下一个或下几个存储单元。--、-=:是移动指针到上一个或上几个存储单元。例如:int*ptr,ary[5]={2,4,6,8,10};ptr=ary;ptr+=3;ptr--;想一想:*ptr++和(*ptr)++有什么的区别?基类型相同的两个指针进行比较运算,其意义是两个指针的位置比较,结果是逻辑值。指针运算的程序举例:把a,b按大小顺序输出。main(){int*p1,*p2,*p,a,b;a=45;b=76;p1=&a;p2=&b;if(*p1*p2){p=p1;p1=p2;p2=p;}printf(a=%d,b=%d,max=%d,min=%d,a,b,*p1,*p2);}输出结果:a=45,b=76,max=76,min=453.指针的关系运算三指针与数组一、一维数组的指针数组的指针:是数组的起始地址。数组元素的指针:是数组元素的地址。当指针变量指向数组或数组元素时,它就是指向数组的指针变量。C规定:⑴数组名代表数组的首地址(起始地址),也就是第一个元素的地址。⑵当指针变量p指向数组时,p+1指向数组的下一个元素。假设一个整型元素占两个字节,p+1是使p的地址加2个字节。如:inta[10],*p;则:p=a;与p=&a[0];等价称指针变量p指向数组元素a[0]p+i、a+i、&a[i]都是a[i]的地址。二、一维数组元素的引用1.用下标法引用数组元素如:a[3]=45;2.用指针法引用数组元素假如:inta[10],*p,i;p=a;则:⑴*(p+i)、*(a+i)则代表元素a[i]⑵*(p+i)也可以写成p[i]⑶*(p+i)、*(a+i)、a[i]、p[i]等价,都代表数组a的第i+1个元素。程序举例:输出10个元素数组中的全部元素。方法二:通过数组名计算数组元素地址,找出元素的值。main(){inta[10]={54,65,8,2,3,56,8,21,57,98},i;for(printf(\n),i=0;i10;i++)printf(%4d,*(a+i));}方法一:下标法。main(){inta[10]={54,65,8,2,3,56,8,21,57,98},i;for(printf(\n),i=0;i10;i++)printf(%4d,a[i]);}方法三:用指针变量指向数组元素main(){inta[10]={54,65,8,2,3,56,8,21,57,98},*p,i;p=a;for(printf(\n),i=0;i10;i++)printf(%4d,*p++);}以上三种方法,利用指针变量效率最高。说明:⑴指针变量与数组名的区别:指针变量是地址变量,数组名是地址常量。即指针变量的内容可以在程序运行过程中被改变;而数组名一旦被定义,它的值就不能被改变了。例如:inti,*p,a[6];则:p=&i;√a=&i;a++;a+=i;不能给常量赋值⑵利用指针变量编程时特别要注意指针变量的当前值。例如:通过指针变量输入输出a数组元素。main(){int*p,i,a[10];p=a;for(i=0;i10;i++)scanf(%d,p++);for(printf(“\n”),i=0;i10;i++)printf(“%6d”,*p++);}应插入语句p=a;注意:*p++、*(p++)、(*p)++、*(++p)的含义三、二维数组的指针1.二维数组的指针概念在C语言中,一个二维数组可以看成是一个一维数组,其中每个元素又是一个包含若干元素的一维数组。假如有定义:inta[2][3];则C语言编译程序认为a数组是由a[0],a[1]两个元素组成的一维数组,a[0]和a[1]分别是包含三个元素的一维数组名,分别代表a数组元素的起始地址(即a[0]是第0行元素的首地址,a[1]是第1行元素的首地址)。因此a和a[0]的含义是不同的2.通过指针引用二维数组元素假如有定义:inta[3][5],i,j;(其中0≤i<3,0≤j<5)则:⑴a[i]和*(a+i)(无条件等价)都是第i行第0列元素的地址,那么a[i]+j、*(a+i)+j、&a[0][0]+5*i+j都是第i行第j列元素的地址。⑵数组a中任意元素a[i][j]的引用可以表示成如下几种形式:a[i][j]、*(a[i]+j)、*(*(a+i)+j)、(*(a+i))[j]、*(&a[0][0]+5*i+j)总结,对二维数组的引用有三种方式:①下标法。如a[i][j]或p[i][j]。②指针法,如*(*(p+i)+j)或*(*(a+i)+j)。③下标指针混合法,如*(a[i]+j),*(p[i]+j),(*(a+i))[j],(*(p+i))[j],*(a[0]+i*n+j)等。3.通过一个行指针变量引用二维数组的元素定义一个由m个元素组成的一维数组的指针变量的一般形式:类型标识符(*指针变量名)[m];例如:假若有语句inta[2][3],(*p)[3];p=a;注意:*p两侧的圆括号不可缺少。则:⑴p是一个指向由3个整型元素组成的一维数组的指针变量。⑵p指向a数组,p+1指向数组a的下一行首地址,a和p的基类型相同,则a数组中任意元素a[i][j]还可以如下表示:*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]例:使用行指针变量访问数组元素。main(){floatfa[5][10],(*pf)[10]=fa;inti,j;for(i=0;i5;i++)for(j=0;j10;j++)*(*(pf+i)+j)=i*j;for(i=0;i5;i++)for(puts(),j=0;j10;j++)printf(%.0f,fa[i][j]);}四指针与字符串字符串指针:字符串的首地址。字符指针变量:指向字符串的指针变量。例如:char*strp=“Hello!”;定义了一个指向字符串的指针变量,并将字符串的首地址赋值给strp指针变量,即:使指针变量strp指向字符串首地址。字符指针变量定义的一般形式:char*指针变量名;字符指针变量定义时可以赋初值。一、单个字符串1.用字符数组存放一个字符串例如:chars[]=Iamastudent.;字符串输出语句可写成:⑴printf(“%s\n”,s);⑵for(i=0;s[i]!=‘\0’;i++)printf(“%c”,s[i]);⑶for(i=0;s[i]!=‘\0’;i++)printf(“%c”,*(s+i));2.用字符指针指向一个字符串例如:char*ps=Iamastudent.;字符串输出语句可写成:⑴printf(“%s\n”,ps);⑵for(;*ps!=‘\0’;ps++)printf(“%c”,*ps);说明:⑴字符数组由若干个元素组成,每个元素中放一个字符。而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中;⑵字符数组和字符指
本文标题:C语言教程 第十章
链接地址:https://www.777doc.com/doc-3675863 .html