c语言%-8.3,C语言程序设计第8章-8.3.pptx

C语言程序设计第8章-8.3.pptx

C 语 言 程 序 设 计 实 例 教 程8.3 二维数组和指针,C 语 言 程 序 设 计 实 例 教 程,第8章 指针,二维数组的定义方法 通过二维数组名引用二维数组元素 二维数组与一维数组的关系 通过定义指针变量来引用二维数组元素 通过数组名的运算实现指针的移动来引用数组元素,本节要点实例37 二维数组名和数组元素的地址二维数组的成员介绍,【实例任务】 定义一个二维数组并赋初值,然后分别输出二维数组名的值,各个一维数组的值,指定数组元素的地址值,指定数组元素的值。程序的运行结果如图8-12所示。,图8-12 程序运行结果实例37 二维数组名和数组元素的地址二维数组的成员介绍,【程序代码】 include “stdio.h“ main int a331,2,3,4,5,6,7,8,9,i,j; /*以下三条输出都是输出二维数组的首地址*/ printf“二维数组名存放第0行的首地址,值为d“,a; printf“n输出二维数组第0行的首地址,值为dn“,a0; printf“ 输出数组元素a00的地址,值为dn“,实例37 二维数组名和数组元素的地址二维数组的成员介绍,【程序代码】 /*通过指针移动输出指定数组元素a11的地址*/ printf“n通过取地址运算符得到a11的地址,值为dn“, 实例37 二维数组名和数组元素的地址二维数组的成员介绍,【相关知识】 1. 二维数组与一维数组的关系 C语言中,把二维数组看成是由多个一维数组组成的。即实例中定义的数组a33,可以看成是由a0、a1、a2这三个一维数组构成,这三个一维数组又各有3个二维数组元素。如a0作为数组名,它的三个数组元素分别为a00、a01、a02。二维数组和一维数组的关系如图8-13所示。实例37 二维数组名和数组元素的地址二维数组的成员介绍,【相关知识】 2二维数组名的值 二维数组名也是一个地址常量,它的值是二维数组的首地址,也是二维数组第0行的首地址。由于a0是第0行的数组名,它的值也是二维数组第0行的首地址,所以*a0的值与*a的值相同,也就是a00的地址值。所以,对于这个二维数组而言,表达式a、*a、*a0、a0、a00的值是相同的。实例37 二维数组名和数组元素的地址二维数组的成员介绍,【相关知识】 3二维数组元素的地址 二维数组名的值为二维数组元素的首地址,二维数组又是由一维数组构成的,那么可以通过多种方法得到任意一个二维数组元素aij的地址。 aij /*直接用取地址运算符*/ aij /*通过一维数组名移动j个存储单元得到其地址*/ *aij /*表达式*ai的值与表达ai的值相同*/ a003*ij /*先找到第一个元素的地址,然后通过指针移动得到其地址*/ a03*ij /*表达式a0的值,即表达式a00的值*/实例38 指针数组和行指针二维数组与指针,【实例任务】 定义一个二维数组、一个指针数组、一个行指针,通过多种方式输出数组元素一个数组元素a12的值。程序的运行结果如图8-14所示。,图8-14 程序的运行结果实例38 指针数组和行指针二维数组与指针,【程序代码】 include “stdio.h“ main int a341,2,3,4,5,6,7,8,9,10,11,12; int i,j,*p3,*q4; /*这里p是一个指针数组,q是一个行指针*/ printf“通过数组名来输出数组元素a12的值n“; printf“直接引用数组元素得a12的值为dn“,a12; printf“通过第2行的首地址得a12的值为dn“,*a12; printf“通过数组名得到a12的值为dn“,**a12; printf“通过a0得到a12的值为dn“,*a04*12; printf“通过a00得到a12的值为dn“,* /*此时pi和ai的用法相同,已经指向数组每行的开头*/实例38 指针数组和行指针二维数组与指针,【程序代码】 printf“通过指针变量直接输出a12的值为dn“,p12; printf“通过指针数组元素来输出a12的值为dn“,*p12; printf“通过指针数组的移动来输出a12的值为dn“,**p12; printf“通过移动指针数组且带下标的方式输出a12的值为dn“,*p12; printf“n通过建立一个行指针来输出a12的值n“; qa; /*为行指针赋值,它在使用上与a等同,但值可以改变*/ printf“通过行指针直接输出a12的值为dn“,q12; printf“通过行指针元素来输出a12的值为dn“,*q12; printf“通过行指针的移动来输出a12的值为dn“,**q12; printf“通过移动行指针且带下标的方式输出a12的值为dn“,*q12; getch; 实例38 指针数组和行指针二维数组与指针,【相关知识】 1通过二维数组元素的地址来引用二维数组元素 上一节,通过多个表达式得到任意一个二维数组元素的地址,那么再通过指针运算符就可引用该二维数组元素。 aij /*直接使用二维数组名*/ *aij /*通过一维数组ai的移动j个存储单元得到其值*/ **aij /*表达式*ai的值与表达ai的值相同*/ *a003*ij /*先找到第一个元素的地址,然后通过指针移动得到其值*/ *a03*ij /*表达式a0的值,即表达式a00的值*/ *aij /*表达式*ai的值即ai的值*/实例38 指针数组和行指针二维数组与指针,【相关知识】 2通过建立指针数组引用二维数组元素 实例中,定义语句中表达式*p3为指针数组。因为 这个运算符的优先级别高于*,所以p先与3结合,说明它是一个有3个数组元素的一维数组,*说明这个数组的3个数组元素均为指针类型。 实例中通过循环语句,将piai, p中每个数组元素的值即为二维数组a每行的首地址,它们的关系如图8-15所示。,这样,通过这个指针数组,可以引用任意二维数组元素。 pij /*a与p对应,直接通过指针数组名引用二维数组元素*/ *pij /*通过指针数组元素的移动来引用二维数组元素*/ **pij /*a与p对应,通过指针移动引用二维数组元素*/ *pij /*a与p对应,通过指针移动引用二维数组元素*/实例38 指针数组和行指针二维数组与指针,【相关知识】 3通过定义行指针引用二维数组元素 实例中,定义语句*q3为行指针,意即q是基类型为包含有3个int型数组元素的指针变量。此时,可以通过表达式qa来直接对其赋值,那么q1的值即为a1的值,q2的值即为a2的值。它们的关系如图8-16所示。,qij /*q与a用法相法,直接通过指针引用二维数组元素 */ *qij /*qi的值与ai的值相同*/ **qij /*qi相当于ai*/ *qij /qi相当于ai*/【课堂精练】,1定义一个有10个元素的整型数组,调用随机函数为各个数组元素赋值,然后查找数组中值小于10000的数数组元素的均重新赋值为0。程序的运行结果为如图8-17所示。,图8-17 程序的运行结果【课堂精练】,根据程序的运行结果,请将下面程序补充完整并调试。 include “stdio.h“ main int a10,i; printf“先输出各个数组元素的值n“; fori0;i10;i _ printf“d “,*ai; printf“n值小于10000的数组元素重新赋值后各个数组元素的值n“; fori0;i10;i _ ai0; printf“d “,ai; getch; 【课堂精练】,2魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2n的平方的nn的方阵,就是有n行n列,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。程序运行结果如图8-18所示。,图8-18 程序运行结果【课堂精练】,魔方阵有如下排列规律 1将1放在第一行中间一列; 2从2开始直到nn止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1; 3如果上一个数的行数为1,则下一个数的行数为n指最下一行; 4当上一个数的列数为n时,下一个数的列数应为1,行数减去1。 5如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。【课堂精练】,根据程序运行结果,读懂下列程序代码并调试。 define N 9 include “stdio.h“ main int i,j,k,aNN; fori0;iN;i /*初始化魔方阵元素置为0,作为有无数字的判断*/ forj0;jN;j aij0; jN/2; a0j1; /*存放数字,让1居第一行中间位置*/【课堂精练】,fork2;kN-1 j0; ifaij0 aijk; else ii2N; jj-1NN; aijk; printf“nn“; fori0;iN;i /* 输出魔方阵 */ printf“ “; forj0;jN;j printf“4d“,aij; printf“nn“; getch; 谢谢,

你可能感兴趣的:(c语言%-8.3)