1、6.1 数组概念数组概念6.2 一维数组一维数组6.3 多维数组多维数组6.4 字符数组字符数组6.5 指针数组与指针数组与main函数的参数函数的参数6.6 内存的动态分配与释放内存的动态分配与释放6.1 数组概念数组概念n数组数组:一组相同数据类型的元素按一定顺序线性一组相同数据类型的元素按一定顺序线性排列。排列。n数组的特点数组的特点:(1)数组是数组是相同数据类型相同数据类型的元素的集合。的元素的集合。(2)数组中的各元素是有数组中的各元素是有先后顺序先后顺序的。它们在内存中按照的。它们在内存中按照这个顺序这个顺序连续存放连续存放在一起。在一起。(3)每个数组元素用整个每个数组元素用整
2、个数组的名字数组的名字和它自己在数组中的和它自己在数组中的位置表达,此位置被叫做位置表达,此位置被叫做下标下标或或索引索引。a0 a1 a2 a3 a4 a5 23 34 -89 -90 12 506.1 数组概念数组概念n数组特点:数组特点:(1)(1)数组是数组是相同数据类型相同数据类型的元素的集合。的元素的集合。(2)(2)数组中的各数组中的各元素元素是是有先后顺序有先后顺序的。它们在内存中按照这的。它们在内存中按照这个顺序连续存放在一起。个顺序连续存放在一起。(3)(3)每个数组元素用整个每个数组元素用整个数组的名字数组的名字和它自己在数组中的位和它自己在数组中的位置表达(此位置被叫做
3、置表达(此位置被叫做下标下标或或索引索引)。)。例如,一个包含例如,一个包含6 6个整型元素的数组个整型元素的数组a,a,定义为:定义为:int a6;int a6;在内存中的顺序存储结构如下:在内存中的顺序存储结构如下:a0 a1 a2 a3 a4 a5 23 34 -89 -90 12 50数组下标数组下标数组名数组名下标变量下标变量6.1 数组概念数组概念n使用数组的好处:使用数组的好处:n便于组织循环便于组织循环n数组按维数分为:数组按维数分为:n一维数组一维数组n多维数组多维数组/求求100个数据的和:个数据的和:int a100=1,2,3,4,100s=0;for(i=0;i=9
4、9;i+)s=s+ai;6.2 一维数组一维数组6.1.1一维数组的声明一维数组的声明6.2.1 一维数组的初始化一维数组的初始化6.2.3一维数组元素的表示方法一维数组元素的表示方法6.2.4 用指针访问一维数组用指针访问一维数组6.2.5 函数参数为访问一维数组的指针函数参数为访问一维数组的指针6.2.6一维数组综合程序设计举例一维数组综合程序设计举例6.1.1一维数组的声明一维数组的声明n声明数组声明数组:指定指定数组名称数组名称、数组所包含的、数组所包含的元素的数据类型元素的数据类型和和元素的个数元素的个数。声明一维数组的语法格式:。声明一维数组的语法格式:数据类型数据类型 数组名常量
5、表达式数组名常量表达式;n常量表达式常量表达式:数组元素的个数(数组元素的个数(length)n符号常量或常量名组成的表达式,不能是变量符号常量或常量名组成的表达式,不能是变量 n 是数组的标志。是数组的标志。n声明数组意味着给数组分配一组连续的存储空间,空间声明数组意味着给数组分配一组连续的存储空间,空间的大小的大小:length*sizeof(dataType)。例如,例如,int a10;声明了含有声明了含有10个元素的整型数组,分配个元素的整型数组,分配10个元素的内存个元素的内存空间(每个元素占空间(每个元素占4个字节)。个字节)。sizeof(a)=40 int a10;10个元素
6、个元素:a0,a1,a2,a9每个元素的数据类型每个元素的数据类型a0a1a2a3a7a8a96.1.1一维数组的声明一维数组的声明空间的大小(字节数)空间的大小(字节数):10*4=40Bytes数组的元素个数(长度):数组的元素个数(长度):1010*sizeof(int)=40 sizeof(a)=406.1.1一维数组的声明一维数组的声明声明数组:声明数组:数据类型数据类型 数组名数组名常量表达式常量表达式;例如:例如:int count=10;char cArraycount;/错误,元素个数错误,元素个数count是变量是变量const int count=10;char cArr
7、aycount;/正确,元素个数是常量正确,元素个数是常量unsigned char bArraycount+1;/正确,元素个数是常量正确,元素个数是常量#define length 100long lArraylegnth;/正确,元素个数是常量正确,元素个数是常量6.2.1 一维数组的初始化一维数组的初始化n数组的初始化:数组的初始化:在声明数组的同时,给数组的每在声明数组的同时,给数组的每一个元素指定一个初始值。一个元素指定一个初始值。n语法格式:语法格式:数据类型数据类型 数组名常量表达式数组名常量表达式=初始化列表初始化列表;或或 数据类型数据类型 数组名数组名=初始化列表初始化列
8、表;n初始化列表初始化列表:用逗号分隔的一组常量值。:用逗号分隔的一组常量值。例如:例如:int a5=1,2,3,4,5;即即a0=1,a1=2,a2=3,a3=4,a4=56.2.1 一维数组的初始化一维数组的初始化例:例:int a5=1,2,3,4,5;即即a0=1,a1=2,a2=3,a3=4,a4=5例:例:计算初始化列表中值的个数来确定数组元素的个数。计算初始化列表中值的个数来确定数组元素的个数。int a=1,2,3,4,5;例:例:初始化列表中的数据个数小于数组元素的个数,则编初始化列表中的数据个数小于数组元素的个数,则编译器给剩下的数组元素的初值译器给剩下的数组元素的初值0
9、。int a5=1,2;即即a0=1,a1=2,a2=0,a3=0,a4=0。6.2.1 一维数组的初始化一维数组的初始化例如例如:char c10=0,1,2;即即c0=48,c1=49,c2=50,c3=c4=c9=0。或或c0=0,c1=1,c2=2,c3=c4=c9=0数组元素的赋值也可通过赋值语句进行:数组元素的赋值也可通过赋值语句进行:例如:例如:short s5;s0=1;s1=2;s2=3;s3=s2-s1;s4=s3-s1-2;6.2.3一维数组元素的表示方法一维数组元素的表示方法n一维数组元素的使用一维数组元素的使用:下标变量表示法下标变量表示法。语法格式为:语法格式为:数
10、组名数组名下标下标n下标的取值范围下标的取值范围:0length-1。n访问数组元素时,下标不能越界。访问数组元素时,下标不能越界。n下标是整型或者可以转化成整型的量下标是整型或者可以转化成整型的量n使用数组元素就像使用简单变量一样使用数组元素就像使用简单变量一样例如:例如:int a100;for(i=0;i=100;i+)ai=i;996.2.3一维数组元素的表示方法一维数组元素的表示方法n避免下标越界的方法:避免下标越界的方法:n用符号名如用符号名如length表示数组元素的个数,用表示数组元素的个数,用length-1作为数组下标的下界。作为数组下标的下界。例如:例如:#define
11、length 100 int alength;for(i=0;i=0;i-)ai=i;例例6-1 从键盘输入一组数放入数组中,逆从键盘输入一组数放入数组中,逆序输出数组的所有元素以及元素之和。序输出数组的所有元素以及元素之和。#include#define length 5void main()int arraylength;int i,total=0;for(i=0;i=length-1;i+)scanf(%d,&arrayi);for(i=0;i=0;i-)printf(%-4d ,arrayi);printf(nTotal of array elements:%dn,total);102
12、0308034Reversed array elements:34 80 30 20 10Total of array elements:1846.2.4 用指针访问一维数组用指针访问一维数组n一个含有一个含有n个元素的数组,在内存将分配个元素的数组,在内存将分配n个个连续的存储单元,每一个数组元素占用的内存连续的存储单元,每一个数组元素占用的内存空间大小一样,且与数组的数据类型相关。空间大小一样,且与数组的数据类型相关。n数组名数组名:代表整个数组的首址(数组的第一个代表整个数组的首址(数组的第一个元素的地址)元素的地址)n每一个数组元素有一个存储地址(每一个数组元素有一个存储地址(数组元素
13、的数组元素的指针指针)。)。n定义一个指针变量指向数组元素(存放数组元定义一个指针变量指向数组元素(存放数组元素的地址)素的地址)n通过指针变量间接访问数组元素通过指针变量间接访问数组元素 int a10=1,3,5,7,9,11,13,15,17,19;int *p;p=a;/指向数组的首址指向数组的首址等价于等价于 p=&a0等价于等价于 int*p=a;或或 int*p=&a0;a0a1a9a2a3a4a5a6a7a8p=&a01.指向一维指向一维数组数组元素的指针变量元素的指针变量6.2.4 用指针访问一维数组用指针访问一维数组n定义一维数组元素的指针变量,语法格定义一维数组元素的指针
14、变量,语法格式:式:类型类型 *变量名变量名;n类型:一维数组的数据类型。类型:一维数组的数据类型。n*:变量名是指针类型。:变量名是指针类型。2.对指针进行加减运算对指针进行加减运算在指针变量指向数组元素时,允许对指针进行如下的加减运算在指针变量指向数组元素时,允许对指针进行如下的加减运算(1)p 指向数组元素指向数组元素 ai p+1指向后一元素指向后一元素 ai+1 p-1指向前一个元素指向前一个元素 ai-1n如,如,a的首址的首址2000,若若p=&a1 则则p的值为的值为2004,则则p+1的值为的值为2008,则则p-1的值为的值为2000。P=&ai;float a10,*p;
15、2.对指针进行加减运算对指针进行加减运算(2)如果的初值为)如果的初值为&a0,则,则p+i或或a+i:ai的地址的地址 p+i或或a+i:指向:指向ai元素元素 通过指针间接存取通过指针间接存取ai 的形式:的形式:*(p+i)、*(a+i)和和 pifloat a10,*p;2.对指针进行加减运算对指针进行加减运算(3)对对p指针变量进行加减赋值运算:指针变量进行加减赋值运算:p=p+i:p指向当前数组元素指向当前数组元素往后往后的第的第i个个元素。元素。p=p-i:p指向当前数组元素指向当前数组元素往前往前的第的第i个个元素。元素。p+或或+p:p指向当前数组元素的指向当前数组元素的后一
16、个后一个元素。元素。p或或-p:p指向当前数组元素的指向当前数组元素的前一个前一个元元素。素。数组名是常量指针,它始终指向数组的首址。如:数组名是常量指针,它始终指向数组的首址。如:a=a+1;是错误的。是错误的。float a10,*p;2.对指针进行加减运算对指针进行加减运算(3)两个指针相减,只有两个指针相减,只有p1和和p2都指向同一数都指向同一数组中的元素时才有意义组中的元素时才有意义 p1-p2:p2与与p1之间有多少个元素之间有多少个元素例如,例如,float a10,*p=a;while(p-a10)/a9 与与a0之间相差之间相差9个元素个元素 printf(“%f“,*p)
17、;p+;例6-2 通过指针遍历数组所有元素。#define length 5void main()int alength=1,2,3,4,5;int i,*p=a;/下标变量法遍历数组元素下标变量法遍历数组元素 for(i=0;i=length-1;i+)printf(%-4d ,ai);printf(n);/数组名常量指针法遍历数组元素数组名常量指针法遍历数组元素 for(i=0;i=length-1;i+)printf(%-4d ,*(a+i);printf(n);1 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 53.通过指针引用数组元素通过指针引用
18、数组元素 /变量指针法遍历数组元素,变量指针的值不变变量指针法遍历数组元素,变量指针的值不变 p=afor(i=0;i=length-1;i+)printf(%-4d ,*(p+i);printf(n);/变量指针法遍历数组元素,变量指针类似于数组名使用,变量指针的值不变变量指针法遍历数组元素,变量指针类似于数组名使用,变量指针的值不变for(i=0;i=length-1;i+)printf(%-4d ,pi);printf(n);/变量指针法遍历数组元素,变量指针的值在变,不断指向下一个元素变量指针法遍历数组元素,变量指针的值在变,不断指向下一个元素 for(i=0;i=length-1;i
19、+)printf(%-4d ,*(p+);printf(n);1 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 56.2.5 函数参数为访问一维数组的指针函数参数为访问一维数组的指针通过函数访问一个通用的一维数组。通过函数访问一个通用的一维数组。n函数定义中,形参为:函数定义中,形参为:f(type*p,int n)或或 f(type p,int n)f(type plen,int n)n函数调用:函数调用:f(a,length)其中其中 type a length;nf1(int p,int n)与与f2(int p2,int n)的区别的区别 int
20、a2,b3;f1(a,2)f1(b,3)f2(a,2)f2(b,3)错误错误例例6-3 完成给一维数组各元素赋值为对应完成给一维数组各元素赋值为对应元素的下标值,将此功能定义为函数元素的下标值,将此功能定义为函数fvoid f(int*a,int n)/或或f(int a,int n)int i;for(i=0;in;i+)ai=i;printf(“%2d”,ai);printf(n);void main()int a10,b5;f(a,10);f(b,5);6.2.6一维数组综合程序设计举例一维数组综合程序设计举例n数组的常用算法:数组的常用算法:n排序排序n插入插入n修改修改n删除删除n查
21、询查询例例6-4 用冒泡排序法对数组进行增序用冒泡排序法对数组进行增序(从小到大)的排序。(从小到大)的排序。n排序的排序的规则规则有两种:一种是有两种:一种是增序增序(从小到大从小到大);另一种是另一种是降序降序(从大到小从大到小)n冒泡排序法:模拟水中气泡的排放规则,使重冒泡排序法:模拟水中气泡的排放规则,使重量量“较轻较轻”(值较小)的气泡浮到上面,重量(值较小)的气泡浮到上面,重量“较重较重”(值较大)的气泡沉到下面。(值较大)的气泡沉到下面。对每一趟排序,从第对每一趟排序,从第1个元素开始,比较相邻元个元素开始,比较相邻元素的大小,按照规则对调两者的位置,最终确素的大小,按照规则对调
22、两者的位置,最终确定一个最大(或最小)的气泡的位置。定一个最大(或最小)的气泡的位置。例如:例如:对对6个数进行冒泡排序法的过程:个数进行冒泡排序法的过程:985420895420859420854920854290854209大数沉淀,小数起泡大数沉淀,小数起泡a0a1a2a3a4a5for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;第第1趟排序趟排序854209584209548209542809542089a0a1a2a3a4a5for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;第第2趟排序趟排序542089452089425089420589a0a1
23、a2a3a4a5for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;第第3趟排序趟排序420589420589240589204589a0a1a2a3a4a5for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;第第4趟排序趟排序204589024589a0a1a2a3a4a5for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;第第5趟排序趟排序for(i=0;iai+1)for(i=0;iai+1)for(i=0;iai+1)for(i=0;iai+1)for(pass=1;pass=5;j+)pass:趟数趟数 从从1 到到 5 size 个元
24、素时个元素时 pass:趟数趟数 从从1 到到 size-1 i 从从 0 到到 size-pass-16个元素时个元素时pass=1pass=2pass=5void bubblesort(int values,int size )int pass,j,temp;for(pass=1;pass=size-1;pass+)for(j=0;jvaluesj+1)temp=valuesj;valuesj=valuesj+1;valuesj+1=temp;将冒泡排序法定义为一函数将冒泡排序法定义为一函数将冒泡排序法定义为一函数将冒泡排序法定义为一函数nbubbleSort(int values,int
25、 n)等同于等同于nbubbleSort(int*values,int n)将打印一维数组功能定义为一函数。将打印一维数组功能定义为一函数。void print(int values,int size)int i;for(i=0;isize;i+)printf(%4 ,valuesi);printf(n);void main()int score1=10,3,56,89,80,60;int score2=78,100,45,12,78,90,3,5;bubblesort(score1,6);print(score1,6);bubblesort(score2,8);print(score2,8)
26、;3 10 56 60 80 893 5 12 45 78 78 80 100形参形参 int a 与与 int a10 区别?区别?例例6-5 在有序的数组中,用折半查找法查在有序的数组中,用折半查找法查找一个特定的值。找一个特定的值。n在在有序有序的数组中,二分查找法是一种比较快捷的数组中,二分查找法是一种比较快捷的查找方法。的查找方法。n折半查找法折半查找法:先将整个数组作为查找区间,:先将整个数组作为查找区间,用用给定的值给定的值与查找与查找区间的中间元素区间的中间元素的值相比较,的值相比较,若相等,则查找成功;若不等,则缩小范围,若相等,则查找成功;若不等,则缩小范围,判断该值落在区
27、间的前一部分还是后一部分,判断该值落在区间的前一部分还是后一部分,再将其所在的部分作为新的查找区间,继续上再将其所在的部分作为新的查找区间,继续上述过程,一直到找到该值或区间长度小于述过程,一直到找到该值或区间长度小于0表表明查找不成功为止。明查找不成功为止。例如:用折半查找法查找例如:用折半查找法查找key=80元素元素3 10 56 60 80 85 a0 a1 a2 a3 a4 a5low=3mid=(low+hight)/2hight=5amid80low=0hight=5mid=4amid=80仅比较仅比较2次即找到关键字。折半查找法是快速查找法。次即找到关键字。折半查找法是快速查找
28、法。int asize,查找是否含有关键字,查找是否含有关键字key的元素,的元素,折半查找法的算法描述过程:折半查找法的算法描述过程:1.设置查找的最初区间设置查找的最初区间low,high,low=0,high=size-1,mid=(low+high)/2;found是否找到是否找到key的标志,初值的标志,初值0。2.判断判断amid和和key之间的关系之间的关系:若若key=amid,则成功找到,置,则成功找到,置found=1,查找结束。查找结束。若若key amid,设定查找范围是右半区间,设定查找范围是右半区间mid+1,high。重复步骤重复步骤2 条件:条件:(low=hi
29、gh)且且 found=03.循环结束时,若循环结束时,若found=1 则找到,否则找不到则找到,否则找不到 key。/函数返回找到的函数返回找到的key的下标位置,返回的下标位置,返回-1则找不到则找不到int binarySearch(int array,int key,int size)int low,high,found=0,mid;int index;low=0;high=size-1;while(found=0)&(lowarraymid)low=mid+1;else if(keyarraymid)high=mid-1;if(found)return index;else ret
30、urn-1;void main()int score1=3,10,56,60,80,85;int loc,key;printf(输入要查找的关键字输入要查找的关键字=?);scanf(%d,&key);loc=binarySearch(score1,key,6);if(loc=-1)printf(找不到!找不到!n);else printf(成功找到!成功找到!%d 的下标位置为的下标位置为%dn,key,loc);输入要查找的关键字输入要查找的关键字=?80成功找到!成功找到!80 的下标位置为的下标位置为46.3 多维数组多维数组n带有一个下标的数组叫做一维数组。带有一个下标的数组叫做一维
31、数组。ain带有两个下标的数组叫做二维数组。带有两个下标的数组叫做二维数组。aij带有两个以上的下标的数组叫做多维数组带有两个以上的下标的数组叫做多维数组 aijk6.3 多维数组多维数组6.3.1 二维数组的声明二维数组的声明6.3.2 二维数组的初始化二维数组的初始化6.3.3 二维数组元素的表示方法二维数组元素的表示方法6.3.4 声明二级指针声明二级指针6.3.5 用指针访问二维数组用指针访问二维数组6.3.6 函数参数为访问二维数组的指针函数参数为访问二维数组的指针6.3.7 二维数组综合程序设计举例二维数组综合程序设计举例6.3.1 二维数组的声明二维数组的声明n二维数组常用于存放
32、矩阵二维数组常用于存放矩阵,第一维和第二维分第一维和第二维分别对应于矩阵的行和列。别对应于矩阵的行和列。n二维数组声明的格式:二维数组声明的格式:类型类型 数组名数组名常量表达式常量表达式1 常量表达式常量表达式2;n常量表达式常量表达式1:第一维下标的长度第一维下标的长度n常量表达式常量表达式2:第二维下标的长度第二维下标的长度n类型:数组元素的数据类型类型:数组元素的数据类型6.3.1 二维数组的声明二维数组的声明 例如:例如:int a23;将创建将创建2行行*3列的二维数组。各元列的二维数组。各元素的下标变量:素的下标变量:n在语言中,二维数组是按行排列的。在语言中,二维数组是按行排列
33、的。nint a23,每个元素占,每个元素占4个个Bytes,整个数组占,整个数组占24个个字节的存储空间。字节的存储空间。n二维数组看作是一个特殊的一维数组二维数组看作是一个特殊的一维数组:一维数组中每一个一维数组中每一个元素又是一个一维数组。元素又是一个一维数组。a a 由由a0a0、a1a1 组成组成6.3.2 二维数组的初始化二维数组的初始化n声明二维数组的初始化声明二维数组的初始化形式形式:(1)分行给二维数组赋初值。)分行给二维数组赋初值。例如:例如:int b32=1,2,2,3,3,4;(2)将所有初值写在一行中。)将所有初值写在一行中。例如:例如:int b32=1,2,3,
34、4,5,6;(3)只给部分元素赋初值。当)只给部分元素赋初值。当 中值的个数少于元素中值的个数少于元素个数时,只给前面部分元素赋值。后面的元素初值缺个数时,只给前面部分元素赋值。后面的元素初值缺省为省为0。例如:例如:int b32=1,2,3;相当于相当于 int b32=1,0,2,0,3,0;6.3.2 二维数组的初始化二维数组的初始化 (4)声明数组时,第声明数组时,第1维的下标的长度可以不确定,但维的下标的长度可以不确定,但第第2维的下标的长度一定要确定。维的下标的长度一定要确定。例如:例如:int b 4=1,2,3,4,5,6,7,8;相当于相当于 int b24=1,2,3,4
35、,5,6,7,8;6.3.3二维数组元素的表示方法二维数组元素的表示方法n二维数组的每个元素,双下标的表示格式:二维数组的每个元素,双下标的表示格式:数组名数组名下标下标1 下标下标2n下标下标1、下标、下标2为非负的整型表达式。为非负的整型表达式。n下标不能越界下标不能越界 例如:例如:int a34;表示元素:表示元素:a23 正确正确 i=1,j=1,a i+1j*3 a34 错误错误 a i+2j*3 a i+1j*46.3.3二维数组元素的表示方法二维数组元素的表示方法n二维数组的遍历访问,需要通过二重循环逐行二维数组的遍历访问,需要通过二重循环逐行(或逐列)进行。(或逐列)进行。例
36、如:例如:int alen1len2,按行遍历:按行遍历:按列遍历按列遍历:for(row=0;rowlen1;row+)for(col=0;collen2;col+)arowcol for(col=0;collen2;col+)for(row=0;rowlen1;row+)arowcol 例例6-6 有一个矩阵,要打印出其每一列的有一个矩阵,要打印出其每一列的最大值位置。最大值位置。n解题思路:二维数组存放矩阵,对二维数组解题思路:二维数组存放矩阵,对二维数组n按列的次序扫描按列的次序扫描:n对某一列对某一列col,用变量,用变量k存放这一列的最大值的行号存放这一列的最大值的行号.开始时,假
37、设第开始时,假设第col列的第列的第0行元素为最大值,行元素为最大值,k=0.n该列的其它元素该列的其它元素arowcol 与akcol值比较值比较n若当前元素大于目前最大值,则若当前元素大于目前最大值,则k=此元素的行号。此元素的行号。for(col=0;collen2;col+)k=0;for(row=0;rowakcol)k=row;printf(第%d列第%d行的元素为最大值。n,col,k);例例6-6 有一个矩阵,要打印出其每一列的有一个矩阵,要打印出其每一列的最大值位置。最大值位置。n定义函数,用于二维数组的数据输入:定义函数,用于二维数组的数据输入:void input(int
38、 alen2)n定义函数,用于二维数组输出:定义函数,用于二维数组输出:void print(int alen2)n形数形数int alen2与与int alen1len2区别?区别?nint alen2比比int alen1len2适用的适用的二维数组范围更广。二维数组范围更广。#define len1 3#define len2 4void input(int alen2);void print(int alen2);void main()int alen1len2;int row,col,k;/二维数组数据输入二维数组数据输入input(a);/二维数组输出二维数组输出printf(n您
39、已经输入的二维数组:您已经输入的二维数组:n);print(a);/输出每一列的最大值输出每一列的最大值for(col=0;collen2;col+)k=0;for(row=0;rowakcol)k=row;printf(第第%d列第列第%d行的元素为最大值。行的元素为最大值。n,col,k);void input(int alen2)int row,col;for(row=0;rowlen1;row+)printf(输入第输入第%d行:行:,row);for(col=0;collen2;col+)scanf(%d,&arowcol);void print(int alen2)int row,
40、col;/二维数组输出二维数组输出for(row=0;rowlen1;row+)for(col=0;collen2;col+)printf(%5d ,arowcol);printf(n);例例6-7 实现实现NN矩阵的转置。矩阵的转置。n解题思路:矩阵的转置是指矩阵的上下解题思路:矩阵的转置是指矩阵的上下三角元素以对角线为中轴线对称互换:三角元素以对角线为中轴线对称互换:n即原来的即原来的i行行j列元素在转置后称为列元素在转置后称为j行行i列元列元素。素。n定义二维数组定义二维数组aNN存放矩阵。存放矩阵。for(i=0;iN;i+)for(j=i+1;jN;j+)aij aji;例例6-7
41、实现实现NN矩阵的转置。矩阵的转置。n随机生成随机生成N*N个数据放入二维数组:个数据放入二维数组:void randoms(int aN)int row,col;srand(unsigned)time(NULL);for(row=0;rowN;row+)for(col=0;colN;col+)arowcol=rand();rand();生成生成0到到32767之间的随机数之间的随机数#include#include srand(unsigned)time(NULL);#include#include#include#define N 4void main()int aNN;int i,j,t
42、;void randoms(int aN);/函数原型函数原型void print(int aN);/函数原型函数原型randoms(a);printf(二维数组转置前:二维数组转置前:n);print(a);for(i=0;iN;i+)/二维数组转置二维数组转置for(j=i+1;jN;j+)t=aij;aij=aji;aji=t;printf(n二维数组转置后:二维数组转置后:n);print(a);1.声明二级指针声明二级指针:type *变量名变量名例如:例如:int a=8;int*p=&a;/一级指针一级指针int*q=&p;6.3.4 声明二级指针声明二级指针 6.3.4 声明二
43、级指针声明二级指针 2.用二级指针访问对象变量用二级指针访问对象变量*q 代表代表 p *q 代表代表 a*q=*q+1 /a=a+16.3.5 用指针访问二维数组用指针访问二维数组1.二维数组元素的地址二维数组元素的地址 二维数组可看做是一个一维数组:此一维二维数组可看做是一个一维数组:此一维数组中每一个元素又是一个一维数组。数组中每一个元素又是一个一维数组。例如:例如:int a34 =1,2,3,4,5,6,7,8,9,10,11,12;由由3行组成:行组成:a0、a1和和a2 nint a34:由由3个一维数组个一维数组a0、a1和和a2组成。组成。a0代表第代表第0行行,存放第,存放
44、第0行的首址行的首址n二维数组各指针之间的关系二维数组各指针之间的关系:a:是二级指针,:是二级指针,指向二维数组的首址指向二维数组的首址,其值为其值为&a0或或&a00*a或或a0:代表第代表第0行行,其值为,其值为&a00;*a:代表代表a00。6.3.5用指针访问二维数组用指针访问二维数组n二维数组各指针之间的关系二维数组各指针之间的关系:(2)a+i:指向第指向第i行行(存放第存放第i行的地址行的地址),或称,或称行指针行指针,其值,其值等于等于&ai0;*(a+i)或或ai代表第代表第i行行,其值等于,其值等于&ai0,即第即第i行第行第0个个元素的地址;元素的地址;*(a+i)+j
45、或或ai+j:指向第:指向第i行第行第 j个元素个元素,其值为,其值为&aij;*(*(a+i)+j):代表代表aij。6.3.5用指针访问二维数组用指针访问二维数组n二维数组各指针之间的关系二维数组各指针之间的关系:取内容运算符取内容运算符*,其结合性为自右至左:,其结合性为自右至左:*a相当于相当于*(*a)。*a是一个二级指针是一个二级指针:a存放存放a0的地址,的地址,a0存存放的是放的是a00的地址,通过的地址,通过a间接地访问间接地访问a00 的形式是的形式是*a6.3.5用指针访问二维数组用指针访问二维数组例例6-8输出二维数组的各指针值。输出二维数组的各指针值。void mai
46、n()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i;/请观察二维数组的各指针的值及其之间的关系请观察二维数组的各指针的值及其之间的关系 printf(a=%d,*a=%d,a0=%d,&a00=%d,a00=%dnn,a,*a,a0,&a00,a00);for(i=0;i3;i+)printf(a+%d=%d,*(a+%d)=%d,a%d=%d,i,a+i,i,*(a+i),i,ai);printf(&a%d0=%d,a%d0=%dn,i,&ai0,i,ai0);6.3.5用指针访问二维数组用指针访问二维数组2.定义指向二维数组的指针变量定义指向二维数组的指
47、针变量,格式:格式:类型说明符类型说明符(*指针变量名指针变量名)长度长度;n*:表示其后的变量是指针类型。:表示其后的变量是指针类型。n园括号园括号()不可少,不可少,如少括号则表示的指针数组如少括号则表示的指针数组n长度:等于二维数组声明时的长度:等于二维数组声明时的第二维第二维下标长度。下标长度。n类型说明符:是二维数组的数据类型。类型说明符:是二维数组的数据类型。n定义的指针变量名:是定义的指针变量名:是指向二维数组的行指针。指向二维数组的行指针。n例如:定义了一个指向第二维长度为例如:定义了一个指向第二维长度为4的二维数组指的二维数组指针变量针变量p:int a34;int(*p)4
48、;6.3.5用指针访问二维数组用指针访问二维数组n例如:定义了一个指向第二维长度为例如:定义了一个指向第二维长度为4的二维数组指的二维数组指针变量针变量p:int(*p)4;int b4;p=&b;b p b0 b1 b3 b2 例如:例如:int a34;int(*p)4;p=a;/指向第指向第0行行p+1:/指向第指向第1行行p+i;/指向第指向第i行行4.通过二维数组的行指针变量,通过二维数组的行指针变量,间接访问间接访问数组元素数组元素aij的一般形式:的一般形式:*(*(p+i)+j)或或 pij6.3.5用指针访问二维数组用指针访问二维数组例例6-9 通过二维数组的行指针变量,通过
49、二维数组的行指针变量,输出二维数组元素。输出二维数组元素。void main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i,j;int(*p)4;/定义二维数组的行指针变量定义二维数组的行指针变量 p=a;for(i=0;i3;i+)/i表示行号表示行号 for(j=0;j4;j+)printf(%3d,*(*(p+i)+j);printf(n);例例6-10 将二维数组线性化成一维数组,通过一将二维数组线性化成一维数组,通过一维数组的指针变量,输出二维数组元素。维数组的指针变量,输出二维数组元素。n解题思路:解题思路:n 定义一维数组的指针变量定义一维数
50、组的指针变量 int*p;int amn;p初值为二维数组的首地址初值为二维数组的首地址,p=a;n数组元素数组元素aij,通过指针变量通过指针变量p的存取形的存取形式为:式为:*(p+i*n+j)其中其中n是二维数组的第二维的长度是二维数组的第二维的长度。aij元素的前面有多少个元素?元素的前面有多少个元素?有有i行个元素,第行个元素,第i行上有行上有j个元素个元素#include void main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int(*p);/定义一维数组的指针变量定义一维数组的指针变量int i,j;p=a;/或或 p=a0;或或 p=&a0
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。