如何给数组中的元素赋值?

来源:互联网 发布:机械工程师必备软件 编辑:程序博客网 时间:2024/05/07 14:06

如果把单个变量看成是“游兵散勇”的话,那么数组对应的是“集团”。集团的“兵”就是我们前面说的数组的元素。这些“兵”不再有单独的名字,而是统一使用编号来区别,这个编号,我们称为“下标”。

在和数组打交道时,我们需要分清:是对整个数组操作,还是对数组中的单个元素进行操作。

 

1. 在定义数组时初始化。

普通变量可以在定义时同时赋初值:

int a = 100;

也可以在定义以后才赋值:

int a;

a = 100;

 

对于数组变量,则只能在定义时,对整个数组赋初值:

 

数据类型 数组变量名[个数] = {元素1初值,元素2初值,};

 

即,将初值用一对 {} ( 花括号 )括起来,相邻的值之间用逗号分隔。

 

比如:

int arr[10] = {9,8,7,6,5,4,3,2,1,0};

上面定义一了个数组 arr,共10个元素。初始值为从9到0。即,执行上面代码以后,arr[0]值为10,arr[1]值为9……arr[9]值为0。

 

在初始化赋值是时,注意所给值的个数不能超过数组的大小,比如:

int arr[10] = {10,9,8,7,6,5,4,3,2,1,0};  //错误!越界了

你定义了数组为10个元素,可是你却赋给它11个值,这称为数组越界:你在宾馆里预定了10间房,你却让11个人去住,多出的那个人挤在哪里呢?编译器遇上这类问题时,很明智地停了下来。

 

不过,你可以给它少于定义个数的初值

int arr[10] = {9,8,7,5};               //允许

你定义了数组为10个元素,但你可以给它少于10个的初始值。那些没有得到初始值的元素值是多少呢?对于全局变量来说,将被编译器初始化为0,对于局部变量而言,则是未定义的值(不可预测的值)。如果只定义数组,没有对其进行任何初始化,同样适于本情况。所有元素的初值均依本数组是全局或局部变量而定,为0或未定义值。

 

可以跳过一两个元素不初始化吗?如:

int arr[10] =  {9,,7,,6};  //跳过中间的某些元素,C:OK;C++: Error

因为我们主要学习C++,所以认为跳过数组中某些元素的初始化赋值是错误的

也就是说,你尽可以先预定下多个房间,然后先只派部分人去住。不过C说:允许你们跳着房号住,而C++则要求依次住下,把空房留在后面。

 

你还可以不指定数组元素个数,直接通过对其初始化来让编译器得到它的实际个数:

 

int arr[] = {9,8,7};  //元素个数为: 3

即,在未指定义大小时,则初始值的个数就是数组元素的个数

 

不过,你不能既不指定数组元素个数,也不进行初始化

int arr[];   //Error, 到底是几个元素?

这也没有什么不好理解的,去几个人,就开几个房间。让宾馆老板自已去数人头,我们不必非得自已报人数——前提是,房客一个一个的都得事先现身。

 

2 .在定义之后为元素赋值

很多时候,我们无法在定义数组的同时就知道数组中各元素的值,所以,这时需要在定义以后各数组中的各个元素赋值。记住,此时只能对单个元素进行直接操作。这和普通变量不一样,下面的代码是错误的:

 

int arr[5];

...

arr[5] = {1,2,3,4,5}; //错,在编译器看来,arr[5]是数组arr的第6个元素。

//或

arr = {1,2,3,4,5};   //错,仍然不行。

这一点和普通变量不一样。也就是说,对数组整体的初始化,只能在定义时实行。

 

大都数情况,我们这样改变数组中某个元素的值:

 

int arr[5];

 

arr[0] = 95; 

arr[1] = 89;

arr[2] = 100;

...

 

前面关于成绩管理的例子中,已经有过如何改变数组元素值的代码:cin >> cj[i]; 这一句将用户输入的成绩赋给数组cj中的第i个元素(i从0计起)。

 

两个数组可以相互赋值吗?答案也是不行:

 

int arr1[5] = {1,2,3,4,5};

int arr2[5];

 

arr2 = arr2; //不行!整个数组之间不能直接相互赋值。

 

你可能很不理解为什么上面的代码会出错,不过在学习后面有关指针及内存地址的更多知识以后,你会明白。现在我们只能告诉你,以我们的所学,可以方便地用一个循环来 实现将一个数组内的值全部赋值给另一个数组,这也称为数组间的拷贝。

 

for(int i=0;i<5;i++)

{

    arr2[i] = arr1[i]; //正确,数组元素之间可以相互赋值。

}

 

当然,这样做可一定要注意:当两个数组的元素个数不一致时,不要越界访问:

 

int arr1[5] = {1,2,3,4,5};

int arr2[6];

 

for(int i = 0;i<6;i++)  // i 从 0 到 5

{

    arr2[i] = arr1[i];

}

 

arr2有6个元素,而arr1只有5个。当循环执行到 i为5时,访问arr1[5]将造成越界。

(越界可以直观地理解为“越出边界“,即越出数组的边界,访问到了数组以外的内存,其内容将是未知的。)