数组及指针 知识点总结.docx
- 文档编号:27453478
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:14
- 大小:18.34KB
数组及指针 知识点总结.docx
《数组及指针 知识点总结.docx》由会员分享,可在线阅读,更多相关《数组及指针 知识点总结.docx(14页珍藏版)》请在冰豆网上搜索。
数组及指针知识点总结
第9章数组
第1课
知识点一
定义一维数组
格式:
类型名数组名[元素个数]
例1定义一个包含4个整数的数组a
inta[4];
例2定义一个包含3个双精度数的数组b
doubleb[3];
注意:
C语言中数组的下界从0开始计数。
例如:
a[4]的4个元素分别为a[0]、a[1]、a[2]、a[3]
知识点二
一维数组的初始化
用一对大括号将数组的初值括起来。
例1inta[3]={1,2,3};
此例中a[0]值为1、a[1]值为2、a[2]值为3
例2inta[5]={0};
此例中数组a的全部元素值均为0
例3inta[3]={1,2,3,4};
此例中由于初值个数多于数组元素个数,所以非法。
例4inta[]={0,0,0,0};
此例中省略数组元素个数,初值为4个0
等价于inta[4]={0};
注意:
数组名是一个常量值,不能对它赋值。
例如:
inta[3];
a=5;此语句非法,应改为a[0]=5;
知识点三
一维数组应用
例1从键盘上输入10个整数,输出最大数和最小数。
#include
main()
{
inta[10],i,max,min;
printf("请输入10个整数:
\n");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
max=a[0];
min=a[0];
for(i=1;i<=9;i++)
{
if(a[i]>max)max=a[i];
if(a[i] } printf("最大数是%d\n",max); printf("最小数是%d\n",min); } 例2斐波数列的定义如下: 1、1、2、3、5、8、13、…… 编程输出斐波数列的第40项值。 #include main() { longa[40]; inti; a[0]=1; a[1]=1; for(i=2;i<=39;i++) a[i]=a[i-1]+a[i-2]; printf("%ld",a[39]); } 练习题 1从键盘上输入10个整数,输出其中完全平方数之和。 2从键盘上输入10个整数,输出和平均数最接近的数。 第2课 知识点一 定义二维数组 格式: 类型名数组名[一维上界][二维上界] 例1定义一个2行2列的整型数组a inta[2][2]; 此例中数组a共有4个元素,分别是a[0][0]、a[0][1]、a[1][0]、a[1][1]。 例2定义一个4行4列的整型矩阵a inta[4][4]; 二维数组看成一维数组 例如: a[3][4]看成由a[0]、a[1]、a[2]组成的一维数组,每个元素又是由4个元素组成的一维数组。 注意: a[0]、a[1]、a[2]不是元素,而是数组每行首地址。 知识点二 二维数组的初始化 用嵌套的大括号将数组初值括起来。 例1inta[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; 例2inta[4][3]={{1,2},{4,5},{7},{10}}; 此例中系统自动给空缺的地方补0 例3inta[4][3]={{1,2},{4,5}}; 系统自动给后面的行补初值0 例4inta[4][3]={1,2,4,5}; 此例中数组a的第一行中元素和第二行的第一个 元素依次为1,2,4,5其余全部为0 知识点三 定义二维数组大小 例1inta[][3]={{1,2,3},{4,5},{6},{8}}; 有4个行花括号,因此说明是4行3列。 例2inta[][3]={1,2,3,4,5}; 这种方式计算规则: 1)第二维数值能被初值个数整除 第一维数=商数 2)第二维数值不能被初值个数整除 第一维数=商数+1 因此上例中表示一个2行3列数组。 知识点四 二维数组应用 例1从键盘上输入5个学生3门课程的成绩,分别计算 每个学生的平均分和每门课程的平均分。 #include #defineM5 #defineN3 main() { inta[M][N],i,j,sum; printf("请输入15个分数(0-100): \n"); for(i=0;i<=M-1;i++) for(j=0;j<=N-1;j++) scanf("%d",&a[i][j]); printf("每个学生的平均分\n"); for(i=0;i<=M-1;i++) { sum=0; for(j=0;j<=N-1;j++) sum=sum+a[i][j]; 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+a[j][i]; printf("%4d",sum/M); } } 例2从键盘上输入一个4行4列整数矩阵,输出左上至 右下对角线元素之和。 #include #defineM4 #defineN4 main() { inta[M][N],i,j,sum=0; printf(“请输入16个整数: \n”); for(i=0;i<=M-1;i++) for(j=0;j<=N-1;j++) scanf("%d",&a[i][j]); for(i=0;i<=M-1;i++) sum=sum+a[i][i]; printf("%d",sum); } 练习题 1从键盘上输入一个4行4列的整数矩阵。 输出此矩阵右上至左下对角线元素之和。 2从键盘上输入一个4行4列的整数矩阵。 输出此矩阵下半三角形的所有元素之和。 3从键盘上输入一个4行4列的整数矩阵。 输出此矩阵最外围元素之和。 指针 第1课 知识点一 定义一级指针 格式: 类型名*变量名 例1定义两个指向整型变量的指针p1和p2。 int*p1,*p2; 例2定义两个整型变量m和n及两个指针p和q,并使 p和q分别指向m和n。 intm,n,*p,*q; p=&m;表示p存放变量m的地址 q=&n;表示q存放变量n的地址 例3定义一个包含10个整数的数组a和一个指针p,并 使p指向a。 inta[10],*p; p=a;表示p指向数组a的首地址,即a[0]的地址。 注意: 例3中p=a不能写成p=&a,因为a本身就是地址。 知识点二 定义二级指针 格式: 类型名**变量名 假设已有下列定义: int**p,*s,k=0; 例如: s=&k;指针s指向变量k的地址 p=&s;指针p指向指针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=0; p=&n; 例如: m=*p;表示将p指向存储单元内容给变量m 等价于m=n; *p=*p+1;等价于n=n+1; 注意: *p=*p+1;还可以写成下面的形式 *p+=1;或++*p;或(*p)++; 知识点二 指针的移动 当指针指向一片连续空间时,移动才有意义。 假设已有下列定义: inta[5],*p,*q,k; p=a; 例如: q=p+2;表示将q指向元素a[2]的地址 p++;表示将p向后移一个单元 q--;表示将q向前移一个单元 k=p[2];等价于k=a[3]; 知识点三 指针的比较 若两指针指向一片连续空间,可比较大小。 假设已有下列定义: inta[10],*p,*q,k; p=a; q=p+2; 例如: if(p 由于条件成立,所以输出p小于q。 k=q-p;表示p和q相差的地址值 最后k值为2 第3课 知识点一 指向数组的指针 假设已有下列定义: int*p,*q,k; inta[3][3]; 例如: p=&a[2][2];表示p指向元素a[2][2]的地址 p=a[1];表示p指向数组a第二行的首地址 p++;此时p指向元素a[1][1]的地址 k=p[2];等价于k=a[2][0]; q=p-3;此时q指向元素a[0][1]的地址 k=q[1];等价于k=a[0][2]; (*p)++;此时元素a[1][1]的值加1 *q++;此时q后移一个单元,a[0][1]值不变。 k=*(a[1]+2);等价于k=a[1][2]; 知识点二 指针数组 格式: 类型名*变量名[元素个数] 假设已有下列定义: int*p[3],a[3][2],k; 此例中p是一个指针数组,包含3个元素,每个元素均为 一个指向int类型的指针。 将指针数组和二维数组关联 for(k=0;k<=2;k++)p[k]=a[k]; 此时p[0]、p[1]、p[2]分别指向数组a每行的首地址。 例如: p[0]=a[0];表示p[0]指向数组a第一行首地址 p[0]++;此时p[0]指向元素a[0][1]的地址 k=*(p[1]+1);等价于k=a[1][1]; k=p[2][1];等价于k=a[2][1]; 注意: p[k]和a[k]的区别 p[k]和a[k]两者均表示数组a第k+1行的首地址。 p[k]能被赋值,而a[k]是地址常量,不能被赋值。 例如: a[0]=p[0];此语句非法,应改为p[0]=a[0]; 知识点三 指针的应用 例1从键盘上输入两个整数,输出较大数。 (要求使用指针) #include main() { inta,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个整数,输出最大数和最小数。 (要求使用指针) #include main() { inta[10],*p,k,max,min; p=a; printf("请输入10个整数: \n"); for(k=0;k<=9;k++) scanf("%d",&p[k]); max=p[0]; min=p[0]; for(k=1;k<=9;k++) { if(p[k]>max)max=p[k]; if(p[k] } printf("最大数是%d\n",max); printf("最小数是%d\n",min); } 例3从键盘上输入一个4行4列的整数矩阵,输出左上至 右下对角线元素之和。 (要求使用指针) #include #defineM4 #defineN4 main() { inta[M][N],*p[M],k,j,sum=0; for(k=0;k<=M-1;k++) p[k]=a[k]; printf("请输入16个整数: \n"); for(k=0;k<=M-1;k++) for(j=0;j<=N-1;j++) scanf("%d",&p[k][j]); for(k=0;k<=M-1;k++) sum=sum+p[k][k]; printf("%d",sum); } 练习题 1从键盘上输入两个整数,输出它们的平方和。 (要求使用指针) 2从键盘上输入10个整数,输出所有完全平方数之和。 (要求使用指针) 3从键盘上输入一个4行4列的整数矩阵,输出最外围 元素之和。 (要求使用指针)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组及指针 知识点总结 数组 指针 知识点 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)