7.1 一维数组的定义和引用
考点1 一维数组的定义及其元素的引用
真考链接
考点1 是 C语言的基本知识。属于重点掌握内容。其中一维数组元素的引用是考查的重点,考核概率为80%。在操作题中,常在修改题中考查一维数组的定义。考核概率为40%。
1.一维数组的定义
一维数组是指数组中的每个元素只带有一个下标的数组。一维数组的一般定义方式为:类型说明符 数组名[常量表达式],……;。例如:
long array[10];
说明:
(1)array是数组名。
(2)此数组共有10个元素。
(3)每个元素的类型都为长整型。
(4)每个元素只有一个下标。在C语言中,每个数组的第一个元素的下标总是0,这也称为数组下标的下界,所以上面数组的最后一个元素的下标应该是9,这也称为数组下标的上界。
(5)在执行上面的语句后,C编译程序将在内存中开辟连续的10个存储单元,每个存储单元的名称就是每个数组元素的名称,如array[0],array[1]…,可以用这样的名字来直接引用各存储单元。
(6)在定义一个数组的语句中,可以有多个数组说明符。例如:
int x[7],y[8],z[9];
(7)可以把数组说明符和普通变量名同时写在一个类型定义语句中。
2.一维数组元素的引用
由于是一维数组,因此引用数组元素时只带一个下标。数组元素的引用形式为:数组名[下标表达式]。
注意:
(1)一个数组元素实质上是一个变量名,代表内存中的一个存储单元,一个数组占据的是一连串连续的存储单元。
(2)引用数组元素时,数组的下标可以是整型常量,也可以是整型表达式。
(3)和变量一样,数组必须先定义后使用。
(4)只能逐个引用数组元素而不能一次引用整个数组。
(5)在C语言程序的运行过程中,系统并不自动检验数组元素的下标是否越界,所以数组两端都可能因为越界而破坏其他存储单元中的数据,甚至破坏程序代码,因此,在编写程序时要保证数组的下标不能越界。
小提示
在定义一个数组时,需要定义数组的类型。所以一定会出现类型说明符。而在引用数组里的元素时,直接写出数组名及要引用元素的下标即可。
真题精选
【例1】下面程序有错误的行是( )。
main()
{ int a[3] = {1};
int i;
scanf("% d",&a);
for(i=1;i < 3;i++)a[0] = a[0] + a[i];
printf("a[0] =% d\n",a[0]);
}
A.3 B.6 C.7 D.4
【答案】D
【解析】本题考查了一维数组的定义、初始化及元素的引用方法。第4行代码scanf输入数据时,要求输入项为地址,而数组名即为数组的首地址,所以不应该再在前面加取地址符号&。
【例2】若有定义:inta[10];语句,则对数组a元素的正确引用是( )。
A.a[10] B.a[3.5] C.a(5) D.a[10-10]
【答案】D
【解析】本题考查了对一维数组引用的基本语法问题,读者需要清楚地了解引用一维数组的基本格式。
【例3】请编写函数fun(),该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出 。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。
试题程序
#include <stdio.h>
#define N 50
#define M 11
void fun(int *a,int *b){
}
double rnd()
{ static t=29,c=217,m=1024,r=0;
r=(r*t+c)%m;
return((double)r/m);
}
void main()
{ int age[N],i,d[M];
for(i=0;i<N;i++)
age[i] =(int)(115*rnd());
/*产生一个随机的年龄数组*/
printf("The original data:\n");
for(i=0;i<N;i++)
printf((i + 1)% 10 == 0?"% 4d \n":"% 4d",age[i]);/*每行输出10个数*/
printf("\n\n");
fun(age,d);
for(i=0;i<10;i++)
printf("% 4d—% 4d:% 4d\n",i*10, i*10+9,d[i]);
printf("Over 100:% 4d\n",d[10]);
}
【答案】void fun(int *a,int *b)
{ int i,j;
for(j=0;j<M;j++)
b[j] =0;/*数组b初始化为0*/
for(i=0;i<N;i++)
if(a[i] > =100)
b[10] ++;/*如果年龄大于等于100,b[10]自增1*/else
b[a[i]/10] ++;/*如果年龄小于100,则将其分别统计到b[a[i]/10]中*/
}
【解析】本题考查数组元素赋初值。本题是一个分段函数的问题,用两个循环来完成。第1个循环的作用是使b中的所有元素值都为0。这个循环不能省略,因为若未对b中的元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]≥100时,按题意要将其统计到b[10]中。else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0~9时,a[i]/10的值为0,且0~9岁的人数正好要存入b[0]中。若a[i]为10~19时,a[i]/10的值为1,且10~19岁的人数正好要存入b[1]中,依此类推。
考点2 一维数组的初始化
真考链接
考点2比较简单,属于重点掌握知识点。在选择题中考核概率为70%。在操作题中主要以填空题和编程题的形式考查。在操作题中考核概率为30%。
当数组定义后,系统会为该数组在内存中开辟一串连续的存储单元,但这些存储单元中并没有确定的值。可以在定义数组时为所包含的数组元素赋初值,如:inta[6] ={ 0,1,2,3,4,5 };
所赋初值放在一对花括号中,数值类型必须与所说明的类型一致。所赋初值之间用逗号隔开,系统将按这些数值的排列顺序,从a[0]元素开始依次给数组a中的元素赋初值。以上语句将a[0]赋值0,a[1]赋值1,……,a[5]赋值5。在指定初值时,第一个初值必定赋给下标为0的元素。也就是说,数组元素的下标是从0开始的。同时,不可能跳过前面的元素给后面的元素赋初值,但是允许为前面元素赋值为0。当所赋初值个数少于所定义数组的元素个数时,将自动给后面的其他元素补以初值0;当所赋初值个数多于所定义数组的元素个数时,也就是说超出了数组已经定义的范围,在编译时系统将给出出错信息。
C语言程序中可以通过赋初值来定义一维数组的大小,定义数组时的一对方括号中可以不指定数组的大小。例如
int a[] = {0,1,2,3,4,5,6,7,8,9};
以上语句定义的数组初始化了10个整数,它隐含地定义了a数组含有10个元素,此定义语句和以下语句是等价的:
int a[10] = {0,1,2,3,4,5,6,7,8,9};
小提示
C语言规定可以通过赋初值来定义数组的大小,这时一对方括号中可以不指定数组大小。
常见问题
如果定义了一个一维数组a[3] ={1,2,3},则a[2]所指的元素的值是多少?
数组元素的下标是从0开始的。同时,不可能跳过前面的元素给后面的元素赋初值,但是允许为前面元素赋值为0。当所赋初值个数少于所定义数组的元素个数时,将自动给后面的其他元素补以初值0。所以a[2]所指元素的值是3。
真题精选
【例1】现有以下程序段:
#include <stdio.h>
main()
{ int k[30] = {12,324,45,6,768,98,21,34,453,456};
int count = 0,i=0;
while(k[i])
{if(k[i] % 2 == 0 ||k[i] % 5 == 0)count++;
i++ }
printf("% d,% d\n",count,i);}
则程序段的输出结果是( )。
A.7,8 B.8,8 C.7,10 D.8,10
【答案】D
【解析】在C语言中,定义一维数组的语句一般形式如下:
类型说明符 数组名[常量表达式];
一维数组的引用形式为:数组名[下标表达式]。count表示能被2或5整除的个数,i则计算有多少个数组元素。
【例2】以下选项中,合法的数组说明语句是( )。
A.inta[] ="string"; B.inta[5] ={0,1,2,3,4,5}; C.chara="string"; D.chara[] ={0,1,2,3,4,5};
【答案】D
【解析】在C语言中,字符变量中存放的是与字符相对应的ASCII码。数值0,1,2,3,4,5所对应的ASCII字符虽然是不可显示的字符,但是这些都可作为控制字符。此时,数组的大小由后面的初始化数据的数量决定,即包含6个元素。
【例3】已知int类型的变量占4个字节,现有以下程序段:
#include <stdio.h>
main()
{ int a[] = {1,2,3,4,5};
printf("% d",sizeof(a));
}
则程序段的输出结果是( )。
A.5 B.10 C.15 D.20
【答案】D
【解析】int类型的数组a初始化了5个整数,它隐含地定义了a数组大小为5个元素,而一个int变量占4个字节,所以程序输出20。
【例4】若有以下语句,则正确的描述是( )。
char x[] ="12345";
char y[] ={'1', '2', '3', '4', '5'};
A.x数组和y数组的长度相同 B.x数组长度大于y数组长度
C.x数组长度小于y数组长度 D.x数组等价于y数组
【答案】B
【解析】由于语句charx[] ="12345";说明是字符型数组并进行初始化,系统按照C语言对字符串处理的规定,在字符串的末尾自动加上串结束标识'\0',因此数组x的长度是6;而数组y是按照字符方式对数组进行初始化的,系统不会自动加上串结束标识'\0',所以数组y的长度是5。
【例5】下列给定程序中,函数fun()的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、a[1]、a[2]、…中,把偶数从数组中删除,奇数个数通过函数值返回。
例如,若a所指数组中的数据最初排列为9、1、4、2、3、6、5、8、7,删除偶数后a所指数组中的数据为9、1、3、5、7,返回值为5。
请在标号处填入正确的内容,使程序得出正确的结果。
注意:部分源程序给出如下。
不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdio.h>
#define N 9
int fun(int a[],int n)
{ int i,j;
j=0;
for(i=0;i<n;i++)
if(a[i]% 2==【1】)
{ a[j] =a[i];【2】;
}
return【3】;
}
main()
{ int b[N] ={9,1,4,2,3,6,5,8,7},i,n;
printf("\nThe original data:\n");
for(i=0;i<N;i++)
printf("% 4d ",b[i]);
printf("\n");
n=fun(b,N);
printf("\nThe number of odd:% d \n", n);
printf("\nThe odd number:\n");
for(i=0;i<n;i++)
printf("% 4d ",b[i]);
printf("\n");
}
【答案】【1】1 【2】j++ 【3】j
【解析】本题考查:if语句条件表达式;自增/自减运算符;函数返回值。
标号【1】:根据题目要求,需要进行奇偶数的判定,可以通过if条件语句来判断数组元素是否是奇数,如果元素不能被2整除,则为奇数,所以填入if(a[i]%2==1)。
标号【2】:将为奇数的元素重新存放到数组的前面,同时下标增1。
标号【3】:函数返回值需要返回数组中奇数的个数,因此返回变量j。