C语言开发基础教程第6章-指针-教学PPT-课件.pptx

上传人(卖家):三亚风情 文档编号:3377040 上传时间:2022-08-25 格式:PPTX 页数:103 大小:4.89MB
下载 相关 举报
C语言开发基础教程第6章-指针-教学PPT-课件.pptx_第1页
第1页 / 共103页
C语言开发基础教程第6章-指针-教学PPT-课件.pptx_第2页
第2页 / 共103页
C语言开发基础教程第6章-指针-教学PPT-课件.pptx_第3页
第3页 / 共103页
C语言开发基础教程第6章-指针-教学PPT-课件.pptx_第4页
第4页 / 共103页
C语言开发基础教程第6章-指针-教学PPT-课件.pptx_第5页
第5页 / 共103页
点击查看更多>>
资源描述

1、第第6章章 指针指针指针与函数 指针数组 二级指针 指针概念 指针运算 指针与数组6.1 指针的概念程序运行过程中产生的数据都保存在内存中,内存是以字节为单位的连续存储空间,每个字节都有一个编号,这个编号称为内存地址。程序中的变量在生存期内都占据一定字节的内存,这些字节在内存中是连续的,第一个字节的地址就称为该变量的地址。6.1 指针的概念1、指针的概念定义一个int类型变量a:int a=10;a在内存中的存储如右图。6.1 指针的概念1、指针的概念编译器会根据变量a的类型int,为其分配4个字节地址连续的存储空间。假如这块连续空间的首地址为0 x0037FBCC,那么这个变量占据0 x00

2、37FBCC0 x0037FBCF这四个字节的空间,0 x0037FBCC就是变量a的地址。6.1 指针的概念1、指针的概念因为通过变量的地址可以找到变量所在的存储空间,所以说变量的地址指向变量所在的存储空间,地址是指向该变量的指针。6.1 指针的概念1、指针的概念存储变量a的内存地址为0 x0037FBCC,如果用一个变量保存该地址,如变量p,那么p就称为指向变量a的指针。6.1 指针的概念2、指针变量的定义定义指针变量的语法如下:变量类型*变量名;变量类型指定定义的指针指向的数据的类型,变量名前的符号“*”表示该变量是一个指针类型的变量。int*p;/定义一个int类型的指针变量多学一招:

3、内存四区多学一招:内存四区1、栈区栈区是一块连续的内存区域,该区域由编译器自动分配和释放,一般用来存放局部变量。栈区空间小,特点是先进后出。2、堆区堆区是不连续的内存区域,各块区域由链表将它们串联起来。该区域一般由程序员分配或释放,若程序员不释放,程序结束时可能由操作系统回收(程序不正常结束则回收不了)。堆区空间大,多学一招:内存四区多学一招:内存四区3、数据区数据区根据功能又可以分为静态全局区和常量区两个域。全局区(静态区)(static):用于存储全局变量和静态变量的区域,初始化的全局变量和静态变量在一块区域,未初始化的全局变量在静态变量的相邻区域。全局区在程序结束后由操作系统释放。常量区

4、:用于存储字符串常量和其他常量的区域,该区域在程序结束后由操作系统释放。多学一招:内存四区多学一招:内存四区4、代码区代码区用于存放函数体的二进制代码。程序中每定义一个函数,代码区都会添加该函数的二进制代码,用于描述如何运行函数。当程序调用函数时,就会在代码区寻找该函数的二进制代码并运行。6.2 指针运算指针的运算都是针对内存中的地址来实现的,主要包括取址运算、取值运算、加减运算、自增自减运算、同类指针相减运算。指针运算6.2.1 取址运算符在程序中定义变量时系统会为变量在内存中开辟一段空间,用于存储该变量的值,每个变量的存储空间都有唯一的编号,这个编号就是变量的内存地址。C语言支持以取址运算

5、符“&”获得变量的地址。6.2.1 取址运算符&符号的使用方法:&变量;int a=10;/定义变量a int*p=&a;/定义int类型的指针p,并取变量a的地址赋值给p6.2.1 取址运算符 小提示:指针变量的赋值在为指针变量赋值时,变量数据类型与指针的基类型最好相同,例如,将int型变量的地址赋值给int*型指针。如果将int型变量的地址赋值给float*型指针,程序虽然不会报错,但由于不同类型指针对应的内存单元数量不同,在解读指针指向的变量时会产生错误。6.2.2 取值运算符指针变量存储的数值是一个地址,直接对地址操作容易出错,针对指针变量的取值并非取出它所存储的地址,而是间接取得该地

6、址中存储的值。C语言支持以取值运算符“*”取得指针变量所指内存中存储的值。6.2.2 取值运算符*符号使用方法:*指针表达式int a=10;/定义变量a int*p=&a;/定义int类型的指针p,并取变量a的地址赋值给p int b=*p;/定义int型变量b,并取指针变量p中存储的变量值赋给b6.2.3 常用指针运算1、指针变量与整数相加减指针变量可以与整数进行相加或相减操作:p+n,p-np是一个指针变量,p+1表示将指针向后移动1个数据长度。数据长度是指针对应的基类型所占的字节数,也称为步长,若指针是int*类型的指针,则p的步长为4字节,执行p+1,则p的值加上4个字节,即p向后移

7、动4个字节。6.2.3 常用指针运算1、指针变量与整数相加减如果p为int*类型的指针变量,则p与p+1的位置如下图。p步长为4字节6.2.3 常用指针运算指针变量的加减运算实质上是指针在内存中的移动。6.2.3 常用指针运算对于单独零散的变量,指针的加减运算并无意义,只有指向连续的同类型数据区域,指针加、减整数才有实际意义,因此指针的加减运算通常出现在数组操作中。注 意6.2.3 常用指针运算2、指针表达式的自增自减运算指针类型变量也可以进行自增或自减运算:p+,p-,+p,-p指针的自增自减运算与指针的加减运算含意是相同的,每自增(减)一次都是向后(前)移动一个步长,即p+、+p最终的结果

8、与p+1是相同的。6.2.3 常用指针运算3、同类指针相减运算同类指针类型可以进行相减操作。pm-pnpm和pn是两个指向同一类型的指针变量。同类指针进行相减运算其结果为两个指针之间数据元素的个数,即指针的步长个数。6.2.3 常用指针运算同类指针之间只有相减运算,没有相加运算,两个地址相加是没有意义的,此外,不同类型指针之间不能进行相减运算。注 意多学一招:空指针、无类型指针、野指针多学一招:空指针、无类型指针、野指针空指针:没有指向任一存储单元的指针。有时可能需要用到指针,但是不确定指针在何时何处使用,因此先使定义好的指针指向空。int*p1=0;/0是唯一不必转换就可以赋值给指针的数据i

9、nt*p2=NULL;/NULL是一个宏定义,其作用与0相同 /在ASCII码中,编号为0的字符就是空多学一招:空指针、无类型指针、野指针多学一招:空指针、无类型指针、野指针无类型指针:使用void*修饰的指针。无类型指针指向一块内存,但其类型不定,程序无法根据这种定义确定为该指针指向的变量分配多少存储空间,所以若要使用该指针为其他基类指针赋值,必须先转换成其他类型的指针。void*p=NULL,*q;/定义一个无类型的指针变量int*m=(int*)p;/将无类型的指针变量p强制转换为int*型再赋值多学一招:空指针、无类型指针、野指针多学一招:空指针、无类型指针、野指针野指针:指向不可用区

10、域的指针。野指针的形成主要有以下两种原因:(1)指针变量没有被初始化。(2)若两个指针指向同一块存储空间,指针与内存使用完毕之后,调用相应函数释放了一个指针与其指向的内存,却未改变另一个指针的指向,将其置空。6.3.1 指针与一维数组1、定义一维数组指针数组在内存中占据一段连续的空间,对于一维数组来说,数组名默认保存了数组在内存中的地址,而一维数组的第1个元素与数组的地址是重合的,因此在定义指向数组的指针时可以直接将数组名赋值给指针变量,也可以取第1个元素的地址赋值给指针变量,另外,指向数组的指针变量的基类型与数组元素的类型是相同的。6.3.1 指针与一维数组1、定义一维数组指针有一个int类

11、型的数组:int a5=1,2,3,4,5;定义指向该数组的指针:int*p1=a;/将数组名a赋值给指针变量p1int*p2=&a0;/取第1个元素的地址赋值给指针变量p26.3.1 指针与一维数组小提示:数组名保存了数组的地址,其功能与指针相同,对数组名取值可以得到数组第1个元素。但数组名与指针又有不同,数组名是一个常量,不可以再对其进行赋值,另外,对数组名取地址得到的还是数组的地址6.3.1 指针与一维数组2、使用指针访问一维数组元素定义了指向数组的指针,则指针可以像使用数组名一样,使用下标取值法对数组中的元素进行访问。p下标 /下标取值法6.3.1 指针与一维数组2、使用指针访问一维数

12、组元素除了下标法,指针还可以通过“*”符号访问数组元素。6.3.1 指针与一维数组以访问数组int a5=1,2,3,4,5;为例(1)移动指针,使指针指向a2,获取指针指向元素的值。p=p+2;/将指针加2,使指针指向a2*p;/通过*运算符获取到a2元素指针p从数组首地址后移动了2个步长,指向了数组第3个元素。6.3.1 指针与一维数组数组是一段连续的内存空间,因此可以使指针在这段内存空间上进行加减运算,其内存图解如下图。6.3.1 指针与一维数组(2)不移动指针,通过数组元素指针间的关系运算指针并取值。*(p+2)/获取元素a2指针p还是指向数组首地址,以指针为依据,取后面两个步长处的元

13、素,即a2。6.3.1 指针与一维数组当指针指向数组时,指针与整数加减表示指针向后或向前移动整数个元素,同样指针每自增自减一次,表示向后或向前移动一个元素。当有两个指针分别指向数组不同元素时,则两个指针还可以进行相减运算,结果为两个指针之间的数组元素个数。6.3.1 指针与一维数组指针p1指向数组首元素,指针p2指向数组第4个元素,则执行p2-p1,结果为3,表示两个指针之间相差3个元素。这是因为指针之间的运算单位是步长,其实p1与p2之间的相差12个字节,即相差3个sizeof(int)。6.3.2 指针与二维数组二维数组与一维数组一样,可以使用指针指向二维数组,通过指针访问二维数组的元素。

14、6.3.2 指针与二维数组假设定义一个二行三列的二维数组:int a23=1,2,3,4,5,6;则数组a的逻辑结构与内存图解如右图。6.3.2 指针与二维数组1、定义二维数组指针与一维数组一样,二维数组的首地址与数组第1个元素是的地址是重合的,因此在定义指向二维数组的指针时,可以将二维数组的数组名赋值给指针,也可以取二维数组的第1个元素的地址赋值给指针。6.3.2 指针与二维数组1、定义二维数组指针二维数组指针的定义要比一维数组复杂一些,定义二维数组指针时需指定列的个数,其格式如下:数组元素类型(*数组指针变量名)列数;例如,定义指向二维数组a的指针:int(*p1)3=a;/二维数组名赋值

15、给指针p1 int(*p2)3=&a00;/取第一个元素的地址赋值给p26.3.2 指针与二维数组1、定义二维数组指针二维数组又可以看作每一行存储的元素为一维数组,在数组a中,a0是个一维数组,表示二维数组的第1行,它保存的也是一个地址,这个地址就是二维数组的首地址,因此在定义二维数组指针时,也可以将二维数组的第1行地址赋值给指针。int(*p3)3=a0;/取第一行地址赋值给 p36.3.2 指针与二维数组2、使用指针访问二维数组元素使用二维数组指针访问数组元素可以通过下标的方式:p00;/访问第1个元素6.3.2 指针与二维数组2、使用指针访问二维数组元素除了下标法,还可以通过移动指针来访

16、问二维数组的元素,在二维数组中,指针每加1,指针将移动一行,以数组a为例,若定义了指向数组的指针p,则p初始时指向数组首地址,即数组的第1行元素,若使p+1,则p将指向数组中的第二行元素。6.3.2 指针与二维数组2、使用指针访问二维数组元素二维数组指针移动的逻辑结构与内存图解如右图。6.3.2 指针与二维数组2、使用指针访问二维数组元素在二维数组a中,指针加1,是从第1行移动到了第2行,在内存中,则是从第1个元素移动到了第4个元素,即跳过了一行(3个元素)的距离。综上,在二维数组中,指针每加1,就移动1行,即移动二维数组中列的个数,如果每行有n个元素,则指针的移动距离为n*步长。6.3.2

17、指针与二维数组在二维数组a中,a0就表示第一行数据,a1表示第二行数据。a0、a1相当于二维数组中一维数组的数组名,指向二维数组对应行的第一个元素,a0=&a00,a1=&a10。6.3.2 指针与二维数组2、使用指针访问二维数组元素在二维数组的每一行中,首地址为ai,此时的ai相当于一维数组的数组名,类比一维数组中使用指针的基本原则,使ai+j,则可以得到第i行中第j个元素的地址,对其使用“*”操作符,则*(ai+j)表示二维数组中的元素aij。若类比取值原则对行地址ai进行转化,则ai可表示为a+i。6.3.2 指针与二维数组在二维数组中,a+i虽然指向的是该行元素的首地址,但它代表的是整

18、行数据元素,只是一个地址,并不表示某一元素的值。*(a+i)仍然表示一个地址,与ai等价。*(a+i)+j表示二维数组元素aij的地址,等价于&aij,也等价于ai+j。注 意6.3.2 指针与二维数组通过以上描述可知,使用指针访问二维数组中的元素有多种表示方法,例如定义指向二维数组的指针p,通过p访问二维数组a中的第2行第2列的元素:p11*(p1+1)*(*(p+1)+1)6.3.2 指针与二维数组二维数组中相关指针与数据的表示形式表示形式含义a二维数组名,指向一维数组a0,为0行元素首地址,也是a00的地址ai,*(a+i)一维数组名,表示二维数组第i行元素首地址,值为&ai0*(a+i

19、)+j二维数组元素地址,二维数组中最小数据单元地址,等价于&aij*(*(a+i)+j)二维数组元素,表示第i行第j列数据的值,等价于aij6.4 阶段案例幻方一、案例描述将从1至n2的自然数排列成纵横各有n个数的矩阵,使每行、每列、每条主对角线上的n个数之和都相等。这样的矩阵就是魔方阵,也称作幻方。本案例要求编写程序,实现奇数阶的幻方。6.4 阶段案例幻方二、案例分析观察3阶幻方,其中的每一行之和、每一列之和、对角线之和都为15,其行、列、对角线之和全部相等。其和sum=n(n2+1)/2=3(32+1)/2=15。6.4 阶段案例幻方二、案例分析幻方的构造规则如下:假定阵列的行列下标都从1

20、开始,在第1行中间置1,对从2开始的其余数依次按下列规则存放:(1)假设当前数的下标为(x,y),则下一个数的放置位置为当前位置的右上方,即坐标为(x-1,y+1)的位置;6.4 阶段案例幻方二、案例分析(2)如果当前数在第1行,则将下一个数放在最后一行的下一列上;(3)如果当前数在最后一列上,则将下一个数放在上一行的第一列上;(4)如果下一个数的位置已经被占用,则下一个数直接放在当前位置的正下方,即放在下一行同一列上。6.4 阶段案例幻方三、案例实现思路(1)矩阵的行数、列数、矩阵中元素的数量都由n确定,在程序中设置scanf()函数,由用户手动控制幻方的规模。本案例针对奇数阶的幻方,因此如

21、果输入的数据不是奇数,则使用goto语句回到输入函数之前;(2)本案例中元素的数量不确定,因此使用malloc()函数动态申请存储空间;6.4 阶段案例幻方三、案例实现思路(3)幻方中的数据按行序优先存储在malloc()函数开辟的空间中,在输出时,每输出n个数据,进行一次换行;(4)将所有的操作封装在一个函数中,在主函数中调用该函数。在函数结束之前,使用free()函数释放函数中申请的堆空间。多学一招:内存分配与回收多学一招:内存分配与回收1、malloc()函数malloc()函数用于申请指定大小的存储空间,其函数原型如下:void*malloc(unsigned int size);参数

22、size为申请的空间字节大小。多学一招:内存分配与回收多学一招:内存分配与回收2、calloc()函数calloc()函数原型如下:void*calloc(unsigned int count,unsigned int size);参数size为需要分配的字节大小,count为分配多少个size。calloc()函数分配的空间会被初始化为0。多学一招:内存分配与回收多学一招:内存分配与回收3、relloc()函数relloc()函数原型如下:void*realloc(void*memory,unsigned int newSize);参数memory为指向堆空间的指针,newSize为新分配空

23、间的大小。该函数是指为memory重新分配一块newSize大小的空间。多学一招:内存分配与回收多学一招:内存分配与回收4、free()函数free()函数用于释放在堆上申请的空间,其参数为指向堆空间的指针。int*p=(int*)malloc(sizeof(int)*n);/申请free(p);/释放指针还经常与函数结合使用,指针可以作为函数参数进行传递,提高参数传递的效率,降低直接传递变量的开销。除此之外,还可以定义指向函数的指针,此种指针称为函数指针,函数指针在实际编程开发中也经常使用。6.5 指针与函数用指针变量作为函数的形参,通过传递地址的方式,使形参和实参都指向主调函数中数据所在地

24、址,从而使被调函数可以对主调函数中的数据进行操作。需要注意的是指针交换包括两个方面:指针指向交换,数据交换。6.5.1 指针变量作为函数参数1、指针指向交换指针指向交换只是指针指向发生了改变,原来地址中的数据并没有改变。6.5.1 指针变量作为函数参数1、指针指向交换指针指向交换只是指针指向发生了改变,原来地址中的数据并没有改变。6.5.1 指针变量作为函数参数1、指针指向交换指针指向交换需要一个辅助指针实现:int*tmp=NULL;/创建辅助变量指针tmp=p;/使用辅助指针记录指针p的指向p=q;/使指针p记录指针q的指向q=tmp;/使指针q指向p原来指向的地址6.5.1 指针变量作为

25、函数参数2、数据交换数据交换是指针指向没有改变,但指向的地址中的数据发生了改变。6.5.1 指针变量作为函数参数2、数据交换数据交换也需要一个中间辅助变量实现:int tmp=0;/创建辅助变量tmp=*p;/使用辅助变量记录指针p指向地址中的数据*p=*q;/将q指向地址中的数据放到p所指地址中*q=tmp;/将p中原来的数据放到q所指地址中6.5.1 指针变量作为函数参数int a=10;int b=20;6.5.1 指针变量作为函数参数int func(int*p1,int*p2)/直接取变量a与b的地址传递给函数func(&a,&b);/定义指向变量的指针int*pa=&a,*pb=&

26、b;func(pa,pb);/将指针作为函数进行传递传递指针传递指针数组指针也可以作为函数参数。数组指针作为函数参数进行传递时,是将数组的首地址传递给函数,这样在函数内部可以通过地址访问数组元素,对数组进行操作。6.5.1 指针变量作为函数参数/一维数组指针作为函数参数int arr110;int*p1=arr1;func1(p1);/二维数组指针作为函数参数int arr223;int(*p2)3=arr2;func2(p2);6.5.2 函数指针1、函数指针的定义与普通变量相同,同样可以定义一个指针指向存放函数代码的存储空间的起始地址,这样的指针叫做函数指针。函数指针的定义格式如下:返回值

27、类型(*变量名)(参数列表)6.5.2 函数指针1、函数指针的定义“*”表示这是一个指针变量,参数列表表示该指针所指函数的形参列表。需要注意的是,由于优先级的关系,“*变量名”要用圆括号括起来。6.5.2 函数指针/声明函数int func(int a,int b);/定义函数指针int(*p)(int,int);/将指针指向函数p=func;2、函数指针的应用(1)调用函数。(2)将函数的地址作为函数参数传入其他函数。6.5.2 函数指针6.5.2 函数指针函数指针不能进行算术运算,如p+n、p+、-p等等,这些运算是无意义的。注 意多学一招:右左法则多学一招:右左法则首先从左侧第1个未定义

28、的标识符看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。在实际开发中,函数指针一个非常重要的应用就是回调函数,回调函数在大型的工程和一些系统框架中很常见,如在服务器领域使用的Reactor架构、MFC编程中使用“句柄”等。回调函数存在的意义是在特定的条件发生时,调用方对该条件下即时的响应处理。6.5.3 回调函数void show(char*s,void(*ptr)()/回调函数(*ptr)(s);void print(char*p)printf(%sn,p);int main()char str

29、16=回调函数;show(str,print);return 0;6.5.3 回调函数6.5.3 回调函数以上代码包含三个函数:show()、print()和main()。show()接收一个字符指针s和一个函数指针ptr,并在函数中将字符指针s作为函数指针所指函数的参数,调用ptr函数;print()接收一个字符指针,并打印该字符指针所指的字符串;main()函数是程序的入口。6.6 指针数组指针变量也是C语言中的一种变量,同样的,指针变量也可以构成数组。若一个数组中的所有元素都是指针类型,那么这个数组是指针数组,该数组中的每一个元素都存放一个地址。6.6.1 定义指针数组定义一维指针数组的

30、语法格式如下:类型名*数组名数组长度;例如,定义一个大小为5的int类型指针数组int*p5;/该数组中的每一个元素都指向一个int类型数据6.6.1 定义指针数组由于“”的优先级比“*”高,在一维指针数组中,数组名先和“”结合,表示这是一个数组,之后数组名与“*”结合,表示该数组中元素的数据类型都是指针类型。注 意6.6.1 定义指针数组指针数组的数组名是一个地址,它指向该数组中的第一个元素,也就是该数组中存储的第一个地址。指针数组的数组名的实质就是一个指向数组的二级指针。一个单纯的地址没有意义,地址应作为变量的地址存在,所以指针数组中存储的指针应该指向实际的变量。6.6.1 定义指针数组定

31、义一个字符型的指针数组a:char*a3=this is a string,hello world,I love China“;该数组的逻辑结构如右图。6.6.1 定义指针数组指针数组名a代表的指针指向指针数组中第一个元素a0所在的地址,a+1即为第二个元素a1所在的地址,以此类推,a+2为第三个元素a3所在地址。访问数组中数据:a0;/值为this is stringa1;/值为hello worlda3;/值为i love China6.6.2 指针数组的应用有一个float类型的数组存储了学生的成绩,其定义如下:float arr10=88.5,90,76,89.5,94,98,65,7

32、7,99.5,68;、再定义一个指针数组str,将arr数组中的成绩的地址赋值给数组str中的元素。6.6.2 指针数组的应用6.6.2 指针数组的应用使用冒泡排序对这一组学生成绩进行排序,有两种方法:操作指针数组str,操作数组arr。(1)操作指针数组str对学生成绩进行排序,只是使指针的指向发生了改变,而原数组arr并没有改变。6.6.2 指针数组的应用6.6.2 指针数组的应用(2)操作数组arr排序时,str数组中的指针指向并没有改变,而数组arr中的数据位置发生了改变。多学一招:指针数组作为多学一招:指针数组作为main()main()函数的参数函数的参数main()函数的完整定义

33、方式如下所示:int main(int argc,char*argv);main()函数有两个参数,参数argc表示在命令行中输入的参数个数,参数argv是字符串指针数组,各元素值为命令行中各字符串的首地址。数组第1个元素指向当前运行程序文件名的字符串。指针数组的长度即参数个数,数组元素初值由系统自动赋予。6.7 二级指针指针还可以指向一个指针,即指针中存储的是指针的地址,这样的指针称为二级指针。根据二级指针中存放的数据,二级指针可分为指向指针变量的指针,和指向指针数组的指针。6.7 二级指针1、指向指针变量的指针定义格式如下:变量类型*变量名;int a=10;/整型变量int*p=&a;/

34、一级指针p,指向整型变量aint*q=&p;/二级指针q,指向一级指针p6.7 二级指针2、指向指针数组的指针指向指针数组的指针也是二级指针。char*a3=0;char*p=a;以上语句中定义的p是指向指针数组的指针,当把指针数组a的地址赋给指针p时,p就指向指针数组a的首元素a0,a0为一个指针型的元素,指向一个char型数组的首元素,而指针p初始时的值为该元素的地址。6.8 阶段案例天生棋局一、案例描述本案例要求创建一个棋盘,在棋盘生成的同时初始化棋盘,根据初始化后棋盘中棋子的位置来判断此时的棋局是否是一局好棋。具体要求如下:(1)棋盘的大小根据用户的指令确定;(2)棋盘中棋子的数量由用

35、户设定;(3)棋子的位置由随机数函数随机确定,若生成的棋盘中有两颗棋子落在同一行或同一列,则判定为“好棋”,否则判定为“不是好棋”。6.8 阶段案例天生棋局二、案例分析本案例需要根据用户输入的数据分别确定棋盘的大小和棋子的数量,所以棋盘的大小是不确定的。为了避免存储空间的浪费,防止因空间不足造成的数据丢失,本案例可动态地申请堆上的空间,来存储棋盘。6.8 阶段案例天生棋局二、案例分析从棋盘的创建到释放,大致包含以下几个步骤:(1)创建棋盘。棋盘的创建应包含空间的申请,用于存储棋盘中对应的信息;(2)初始化棋盘。创建好的棋盘是一个空的棋盘,棋盘在显示之前应先被初始化;6.8 阶段案例天生棋局二、

36、案例分析(3)输出棋盘。创建并初始化的棋盘包含棋盘的逻辑信息,棋盘的输出应包含棋盘的格局;(4)销毁棋盘。动态申请的空间需要被释放。6.8 阶段案例天生棋局三、案例实现思路(1)创建棋盘:动态申请棋盘空间,返回一个二级指针。(2)初始化棋盘:利用随机数确定棋子在棋盘上的位置。(3)输出棋盘:棋盘使得制表符搭建,有棋子的位置使得棋子替换制表符。(4)销毁棋盘:手动释放空间。(5)主函数:调用相应函数完成棋局。6.9 指针与const1、常量指针常量指针的作用是使当前指针所指向变量的值在程序运行时不能被修改。const 数据类型*指针变量名;示例代码:int num=10;const int*p=

37、#/const修饰指针p指向的num,num是常量6.9 指针与const2、指针常量指针常量其实就是一个常量,该指针存放的地址不能被改变。数据类型*const 指针变量名;示例代码如下:int num=10;int*const p=#/const修饰指针p,指针p指向不能改变6.9 指针与const3、指向常量的常指针指向常量的常指针就是指针所指向的地址不能被改变,且所指向地址中的值也不能被改变。const 数据类型*const 指针变量名;示例代码如下:int num=10;const int*const p=#/指针p与数据num均为常量 6.10 本章小结本章首先讲解了指针的概念与指针的运算,然后讲解了指针与数组、指针与函数、指针数组的相关知识,最后讲解了二级指针、指针与const的相关知识,通过本章的学习,读者应能掌握多种指针的定义与使用方法,使用指针优化代码,提高代码的灵活性。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C语言开发基础教程第6章-指针-教学PPT-课件.pptx)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|