1、数组及指针 知识点总结第9章 数组第1课知识点一定义一维数组格式: 类型名 数组名元素个数例1 定义一个包含4个整数的数组a int a4;例2 定义一个包含3个双精度数的数组b double b3;注意: C语言中数组的下界从0开始计数。例如: a4的4个元素分别为a0、a1、a2、a3知识点二一维数组的初始化用一对大括号将数组的初值括起来。例1 int a3=1, 2, 3; 此例中a0值为1、a1值为2、a2值为3例2 int a5=0; 此例中数组a的全部元素值均为0例3 int a3=1, 2, 3, 4; 此例中由于初值个数多于数组元素个数,所以非法。例4 int a =0, 0,
2、 0, 0; 此例中省略数组元素个数,初值为4个0等价于int a4=0;注意: 数组名是一个常量值,不能对它赋值。例如: int a3; a=5; 此语句非法,应改为a0=5; 知识点三一维数组应用例1 从键盘上输入10个整数,输出最大数和最小数。#includemain() int a10,i,max,min; printf(请输入10个整数:n);for(i=0;i=9;i+) scanf(%d,&ai); max=a0; min=a0;for(i=1;imax) max=ai; if(aimin) min=ai; printf(最大数是%dn,max); printf(最小数是%dn,
3、min);例2 斐波数列的定义如下: 1、1、2、3、5、8、13、 编程输出斐波数列的第40项值。#includemain() long a40;int i; a0=1; a1=1;for(i=2;i=39;i+) ai=ai-1+ai-2; printf(%ld,a39);练习题1 从键盘上输入10个整数,输出其中完全平方数之和。2 从键盘上输入10个整数,输出和平均数最接近的数。第2课知识点一定义二维数组格式: 类型名 数组名一维上界二维上界例1 定义一个2行2列的整型数组aint a22;此例中数组a共有4个元素,分别是a00、a01、a10、a11。例2 定义一个4行4列的整型矩阵a
4、 int a44;二维数组看成一维数组例如: a34看成由a0、a1、a2组成的一维数组,每个元素又是由4个元素组成的一维数组。注意: a0、a1、a2不是元素,而是数组每行首地址。知识点二二维数组的初始化用嵌套的大括号将数组初值括起来。例1 int a43= 1,2,3, 4,5,6, 7,8,9, 10,11,12 ;例2 int a43= 1,2, 4,5, 7, 10 ;此例中系统自动给空缺的地方补0例3 int a43= 1,2, 4,5 ;系统自动给后面的行补初值0例4 int a43=1, 2, 4, 5;此例中数组a的第一行中元素和第二行的第一个元素依次为1,2,4,5其余全部
5、为0知识点三定义二维数组大小例1 int a 3= 1,2,3, 4,5, 6, 8 ; 有4个行花括号,因此说明是4行3列。例2 int a 3=1, 2, 3, 4, 5; 这种方式计算规则:1)第二维数值能被初值个数整除 第一维数=商数2)第二维数值不能被初值个数整除 第一维数=商数+1因此上例中表示一个2行3列数组。知识点四二维数组应用例1 从键盘上输入5个学生3门课程的成绩,分别计算每个学生的平均分和每门课程的平均分。#include#define M 5#define N 3main() int aMN,i,j,sum; printf(请输入15个分数(0-100):n); for
6、(i=0;i=M-1;i+) for(j=0;j=N-1;j+) scanf(%d,&aij); printf(每个学生的平均分n); for(i=0;i=M-1;i+) sum=0; for(j=0;j=N-1;j+) sum=sum+aij; printf(%4d,sum/N); printf(n); printf(每门课程的平均分n); for(i=0;i=N-1;i+) sum=0;for(j=0;j=M-1;j+) sum=sum+aji; printf(%4d,sum/M); 例2 从键盘上输入一个4行4列整数矩阵,输出左上至右下对角线元素之和。#include#define M
7、4#define N 4main() int aMN,i,j,sum=0; printf(“请输入16个整数:n”); for(i=0;i=M-1;i+) for(j=0;j=N-1;j+) scanf(%d,&aij); for(i=0;i=M-1;i+) sum=sum+aii;printf(%d,sum);练习题1 从键盘上输入一个4行4列的整数矩阵。输出此矩阵右上至左下对角线元素之和。2 从键盘上输入一个4行4列的整数矩阵。输出此矩阵下半三角形的所有元素之和。3 从键盘上输入一个4行4列的整数矩阵。输出此矩阵最外围元素之和。指针第1课知识点一定义一级指针格式: 类型名 *变量名例1 定
8、义两个指向整型变量的指针p1和p2。 int *p1, *p2;例2 定义两个整型变量m和n及两个指针p和q,并使 p和q分别指向m和n。int m, n, *p, *q;p=&m; 表示p存放变量m的地址q=&n; 表示q存放变量n的地址例3 定义一个包含10个整数的数组a和一个指针p,并使p指向a。 int a10, *p; p=a; 表示p指向数组a的首地址,即a0的地址。注意: 例3中p=a不能写成p=&a,因为a本身就是地址。知识点二定义二级指针格式: 类型名 *变量名假设已有下列定义: int *p, *s, k=0;例如: s=&k; 指针s指向变量k的地址 p=&s; 指针p指
9、向指针s的地址此时p为指向指针的指针,即二级指针。知识点三指针间的赋值假设已有下列定义: int *q, *p, k=0; q=&k;例如: p=q; 表示两指针间赋值,读作p指向q。此时p和q均指向变量k的地址。知识点四空指针在C语言中空值用NULL表示,其值为0定义指针时可以给指针赋值NULL例如: int *p=NULL; 表示p没有指向任何地址等价于p=0; 或 p=0;注意: 此时指针p没有实际单元,所以暂时不能访问。例如: int *p=NULL; printf(“%d”,*p); 此语句会产生出错信息第2课知识点一通过指针引用存储单元假设已有下列定义: int *p, m, n=
10、0;p=&n;例如: m=*p; 表示将p指向存储单元内容给变量m等价于m=n; *p=*p+1; 等价于n=n+1;注意: *p=*p+1; 还可以写成下面的形式*p+=1; 或 +*p; 或 (*p)+;知识点二指针的移动当指针指向一片连续空间时,移动才有意义。假设已有下列定义:int a5, *p, *q, k;p=a;例如: q=p+2; 表示将q指向元素a2的地址 p+; 表示将p向后移一个单元 q-; 表示将q向前移一个单元 k=p2; 等价于k=a3;知识点三指针的比较若两指针指向一片连续空间,可比较大小。假设已有下列定义:int a10, *p, *q, k; p=a; q=p
11、+2;例如: if( pq) printf(“p小于q”);由于条件成立,所以输出p小于q。 k=q-p; 表示p和q相差的地址值最后k值为2第3课知识点一指向数组的指针假设已有下列定义: int *p, *q, k;int a33;例如: p=&a22; 表示p指向元素a22的地址p=a1; 表示p指向数组a第二行的首地址 p+; 此时p指向元素a11的地址k=p2; 等价于k=a20; q=p-3; 此时q指向元素a01的地址 k=q1; 等价于k=a02; (*p)+; 此时元素a11的值加1 *q+; 此时q后移一个单元,a01值不变。 k=*(a1+2); 等价于k=a12;知识点二
12、指针数组格式: 类型名 *变量名元素个数假设已有下列定义: int *p3, a32, k;此例中p是一个指针数组,包含3个元素,每个元素均为一个指向int类型的指针。将指针数组和二维数组关联for(k=0;k=2;k+) pk=ak;此时p0、p1、p2分别指向数组a每行的首地址。例如: p0=a0; 表示p0指向数组a第一行首地址 p0+; 此时p0指向元素a01的地址 k=*(p1+1); 等价于k=a11; k=p21; 等价于k=a21;注意: pk和ak的区别 pk和ak两者均表示数组a第k+1行的首地址。pk能被赋值,而ak是地址常量,不能被赋值。例如: a0=p0; 此语句非法
13、,应改为p0=a0;知识点三指针的应用例1 从键盘上输入两个整数,输出较大数。(要求使用指针)#includemain() int a,b,*p,*q; p=&a; q=&b; printf(请输入两个整数:n); scanf(%d%d,p,q); if(*p*q) printf(%d,*p); else printf(%d,*q);例2 从键盘上输入10个整数,输出最大数和最小数。 (要求使用指针)#includemain() int a10,*p,k,max,min; p=a; printf(请输入10个整数:n); for(k=0;k=9;k+) scanf(%d,&pk); max=p
14、0; min=p0; for(k=1;kmax) max=pk; if(pkmin) min=pk; printf(最大数是%dn,max); printf(最小数是%dn,min);例3 从键盘上输入一个4行4列的整数矩阵,输出左上至 右下对角线元素之和。(要求使用指针)#include#define M 4#define N 4main() int aMN,*pM,k,j,sum=0; for(k=0;k=M-1;k+) pk=ak; printf(请输入16个整数:n);for(k=0;k=M-1;k+) for(j=0;j=N-1;j+) scanf(%d,&pkj); for(k=0;k=M-1;k+) sum=sum+pkk; printf(%d,sum);练习题1 从键盘上输入两个整数,输出它们的平方和。 (要求使用指针)2 从键盘上输入10个整数,输出所有完全平方数之和。 (要求使用指针)3 从键盘上输入一个4行4列的整数矩阵,输出最外围 元素之和。(要求使用指针)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1