自考计算机与程序设计9数组Word文件下载.docx
《自考计算机与程序设计9数组Word文件下载.docx》由会员分享,可在线阅读,更多相关《自考计算机与程序设计9数组Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
如a[*]
注:
当同时定义多个数组时彼此之间用,号隔开
如doublew[22],v[100],u[5];
以上定义了三个数组。
需要注意的是,【】中的内容只能是整型常量或整型常量表达式。
如inta[11+22]也可以。
★一维数组元素的引用
数组[下标表达式]
其实x[0],x[j],x[i+k]都是对数组中元素的合法引用形式。
但是需要注意的是下标表达式的值必须大于或等于0,并且小于数组上界的数。
能过上面知识讲解,大家应该建立以下概念:
1:
一个数组元素实质上就是一个变量名,代表内存中一个存储单元。
一个数组占有一串连续的存储单元。
2:
在C语言中一个数组不能整体引用。
不能说用一个数组名就代表整个数组了。
这是错误的。
因为在C语言中规定数组名是一个地址常量,它代表整个数组的首地址。
int*p;
inta[10]p=a(p=&
a[0])a==&
a[0]a=10
3:
数组元素中下标表达式的值必须是整数。
在编写程序时保证数组下标不越界是十分重要的。
a[2.5]a[10]=123
★一维数组的初始化
一维数组的初始化,其实就是给数组元素赋值。
inta[8]={0,1,2,4,5,6,7}
所赋的值放在等号后的一对花括号中,数值类型必须必须与所说明的类型一致,所赋值之间用逗号隔开。
系统会按赋值顺序来自动分配。
当花括号中的值少于数组元素个数时,将自动给数组后面元素赋值0.如
inta[10]={1}这个时候除了a[0]=1外,其它的都是0;
对于字符数组也是一样;
chara[10]={‘!
’}
不够的也会赋值‘\0’
通过赋初值定义数组的大小
C语言中规定,可以通过赋初值来定义数组的大小,这时数组说明符的一对方括号中可以不指定数组的大小。
如inta[]={1,1,1,1,1,1,1,1,1,1}
这样相当于数组中有了10个元素
例题:
编写一个程序,通过键盘给数组a中的10个成员赋初值。
#include<
stdio.h>
main()
{
inta[10];
a是地址常量
inti,*p;
p=a;
for(i=0;
i<
10;
i++)
{scanf(“%d”,p);
printf(“a[i]=%d”,*p);
}
编写一个程序定义一个含有30个成员的数组。
并给其赋值,要求从1这样的奇数开始。
当赋值完毕后,按每行10个输出。
include<
#definem30
inta[m];
inti,k=1;
m;
{a[i]=k;
k+=2;
{printf(“a[%d]=%d”,i,a[i]);
if((i+1)%10==0)
printf(“\n”);
9.2一维数组和指针
★一维数组和数组元素的地址
前言:
定义的数组名可以认为是一个存放地址值的指针变量名,其中的地址值是数组第一个元素的地址,也就是数组所占一串连续存储单元的起始地址。
重要的是:
这个指针变量中的地址值不可改变,也就是说,不可以给数组重新赋值。
因此,也可以认为数组名是一个地址常量。
如:
floata[10],*p,x;
语句a=&
x或a++这样的语句都是非法的。
因为不能给a重新赋地址值。
一旦定义a永远指向a数组的首地址。
虽然不可以改变数组名a中的内容,但可以用对数组名加一个整数的办法,来依次表达该数组中不同元素的地址。
inta[10],*p;
p=a+4~~~~~~~~~~p=&
a[4]
再如:
for(k=0;
k<
k++)
p=a+k;
在循环中并没有改变数组名a中的内容,但通过表达式:
a+k逐一给出了a数组中每个元素的地址,使p依次指向a数组中和每一个元素。
如果要能过类似上面的语句给数组中的元素赋值,语句为:
for(k=0;
scanf(“%d”,a+k);
如有p=a或p=&
a[0]这两个表达式所要表达的意思是一样的。
都是指指针P指向了数组a的首地址。
所以当要依次访问数组中的每一个元素时可以用以下的两个形式;
p++;
或a+k(k的值是不断变化的如上面的for语句一样)
★通过数组的首地址引用数组元素
a是数组元素的首地址,a(即a+0)的值即等于&
a[0],则用a+1的值等于&
a[1].
在以前我们学过“间接访问运算符”----“*”来引用地址所在的存储单元。
因此对于数组a[0],可以用表达式*&
a[0]来引用也可以用*(a+0),还可以用a[0]来表示。
但需要注意的是对于*(p+k)这样的表达式不能这样写*p+k,这样写的话就错了。
代表指针取值后再加K的值了。
总结:
表示数组元素s[i]的表达式应当有
s[i]*(s+i)*(p+i)*p[i]
(但当p=s+2时,p=&
a[2].*p[0]就是a[2]的值了)
9.3函数之间对一维数组和数组元素的引用
数组元素作实参
每个数组元素实际上代表内存中的一个存储单元,故和普通变量一样,对应的形参必须是类型相同的变量。
数组元素的值可以传送给该变量,在函数中只能对该变量进行操作,而不能直接引用数组元素,更不能在函数中改变对应数组元素中的值。
数组名作实参
数组名也可以作为实参传送,但数组名是一个地址值,因此,对应的形参就应当是一个指针变量,此指针变量的基类型必须与数组的类型一致。
这样就可以通过指针变量来引用调用函数中对应的数组元素,从而达到对调用函数中对应的数组元素进行操作而改变其中的值。
例:
编写程序,通过一个函数给主函数中定义的数组输入若干大于或等于0的整数,用负数作为输入结束标志,调用另一个函数输出该数组中的数据。
#include<
#defineM100定义了一个符号常量宏定义M就是100
voidarrout(int*,int);
intarrin(int*);
ints[M],k;
k=arrin(s);
实参是一个数组名
arrout(s,k);
intarrin(int*a)对应的形参是一个指针接受s传递过来的值
inti,x;
i=0;
scanf(“%d”,&
x);
while(x>
=0)
*(a+i)=x;
给地址赋值输入的值
i++;
returni;
voidarrout(int*a,intn)
inti;
n;
printf(((i+1)%5==0)?
”%4d\n”;
”%4d”,*(a+i));
printf(“\n”);
当数组名作为实参时,对应的形参除了是指针外,还可以用另外两种形式。
在上面的题目中数组名作为实参时,函数的首部用的是指针arrin(int*a),还可以用以下的形式调用:
、
arrin(int*a)
arrin(inta[])
arrant(inta[M])
9.3.3数组元素地址作为实参
当用数组元素地址作为实参时,因为是地址值,所以对应的形参也应当是基类型相同的指针变量。
例:
编写函数,对具有10个元素的char类型数组,从下标为4的元素开始,全部设置星号“*”;
保持前4个元素中的内容不变。
假设数组是c[10]={‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘G’,‘H’,‘I’,‘J’}
根据题意可以知道想要从E开始后面的全变成*
编写一个改变的函数,编写一个输出的函数。
#defineM10
#defineB4
voidsetstar(char*,int);
voidarrout(char*,int);
下面有函数调用,一开始是函数的声明
charc[M]={‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘G’,‘H’,‘I’,‘J’};
setstar(&
c[4],M-B);
发生了函数调用,实参数组中第5个元素的地址值
arrout(c,M);
输出首地址,输出m个
voidsetstar(char*a,intn)
*(a+i)=’*’;
voidarrout(char*a,intn)
inti;
for(i=0;
printf(“%c”,a[i]);
输出数组中存储的数字
9.4一维数组应用举例
编写程序,定义一个含有15个元素的数组,并编写函数分别完成以下操作。
1,调用C库函数中的随机函数给所有元素赋以0-49的随机数;
2,输出数组元素中的值。
3,按顺序对每隔三个数求一个和数,并传回主函数。
4,最后输出所有求出的和的值。
#include“stdlib.h”
#defineSIZE15
#defineN3
voidgetrand(int*,int);
voidgetave(int*,int*,int);
voidpriarr(int*,int);
intx[SIZE],w[SIZE/N]={0};
getrand(x,SIZE);
printf(“output%drandomnumbers:
\n”,SIZE);
priarr(x,SIZE);
getave(x,w,SIZE);
printf(“Output5sumnumbers:
\n”);
priarr(w,SIZE/N);
voidgetrand(int*a,intn)
a[i]=rand()%50;
voidgetave(int*a,int*b,intn)
inti,j,sum;
for(sum=0,i=0,j=0;
=n;
sum+=a[i];
if((i+1)%3==0)
b[j]=sum;
sum=0
j++;