数组及指针 知识点总结.docx
《数组及指针 知识点总结.docx》由会员分享,可在线阅读,更多相关《数组及指针 知识点总结.docx(14页珍藏版)》请在冰豆网上搜索。
![数组及指针 知识点总结.docx](https://file1.bdocx.com/fileroot1/2023-7/1/30305956-9e7e-4880-8f7d-cb7d15c727e0/30305956-9e7e-4880-8f7d-cb7d15c727e01.gif)
数组及指针知识点总结
第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列的整数矩阵,输出最外围
元素之和。
(要求使用指针)