C++语言学习记录-15:数组

数组的概念

数组是用来储存和处理大量同类型数据的数据结构。
数组是具有一定顺序关系的若干对象的集合体,组成数组的对象被称为该数组的元素。数组可以由除void类型以外的任意类型构成,它可以将一群相同类型的数据批量储存处理。

数组的声明及使用

比如要声明一个称为“first”的int类型数组,其中可以放置10个元素,声明方式如下:

int first[10];

这是一个一维数组。称为second的double类型二维数组声明方式如下:

double second[5][3];

这里面的元素个数为15,可以看作一个五行三列的表格。
同时,与python中的数组一样,所有编程语言中的数组序号(即下标)都是从0开始。在使用数组时,只能分别对数组的各个元素进行操作,数组中的元素就是通过下标区分的。
数组在使用过程中下标值不能超过声明时所确定的上下界,否则会发生数组越界的情况。下面一个程序是数组的声明和使用。

#include<iostream>
using namespace std;
int main()
	int a[10],b[10];
	for(int i = 0; i < 10; i++){
		a[i] = i * 2- 1;
		b[10 - i - 1] = a [i];
	}
	for( int i = 0; i < 10; i++){
		cout<<"a["<<i<<"]="<<a[i]<<"  ";
		cout<<"b["<<i<<"]="<<b[i]<<endl;
	}
	return 0;
}

输出结果如下:

a[0]=-1  b[0]=17
a[1]=1  b[1]=15
a[2]=3  b[2]=13
a[3]=5  b[3]=11
a[4]=7  b[4]=9
a[5]=9  b[5]=7
a[6]=11  b[6]=5
a[7]=13  b[7]=3
a[8]=15  b[8]=1
a[9]=17  b[9]=-1

上面的程序对其中的每一个元素都进行了运算。

数组的储存

数组元素在内存中是顺序且连续储存的。意味着相邻的数组元素在内存中的物理地址也是连续的。
这一点在一维数组中是一件比较明显的事,在二维数组中,则是按照“行优先”的规则进行存储。在内存中的储存方式如下:

m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2]

数组的初始化

数组的初始化就是在声明数组时给部分或全部元素赋初值,例如:

int a[3] = {1, 1, 1};

这样赋初值的方式也可以不用写元素的个数

int a[] = {1, 1, 1}

也可以用这样的方式对前几个元素进行初始化

int a[5] = {1, 1, 1}

这时只有前三个元素被初始化了。
有一点需要注意,当给定的初值个数小于元素个数时,剩下的元素会被自动赋予0值,定义一个数组时没有赋予任何初值的,对于静态生存期的数组,每个元素都会被赋予0值,对于动态生存期的数组,每个元素的初值都是不确定的。
多维数组的初始化也类似,它也可以有以下等价的写法:

int a[2][3]={1, 0, 0, 0, 1, 0};
int a[][3]={1, 0, 0, 0, 1, 0};
int a[][3]={{1, 0, 0}, {0, 1, 0}};

多维数组初始化可以不用给出第一维的下标。
数组也可以作为常量进行声明。

const float f[3]={1.0, 2.0, 3.0};

这时数组中的每一个元素都会被当成常量对待。
数组的初始化只能在声明过程中进行,同时,每一个数组的值不能直接赋给另一个数组
数组名和数组中的元素也可以作为函数的参数以实现函数间数据的传递和共享。
如果使用数组名作为函数的参数,则实参和形参都应该是数组名,且类型都要相同。与普通变量做参数不同,用数组名传递数据时,传递的是地址形参数组和实参数组的首地址重合,后面的元素按照各自在内存中的储存顺序进行对于,对应元素使用相同的数据存储地址,因此实参数组的元素个数不应该少于形参数组的元素个数。如果在被调函数中对形参数组元素值进行改变,主调函数中实参数组的相应元素值也会发生改变。
在下列的程序中,要在主函数中初始一个矩阵并将元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数后输出各行的和。

#include<iostream>
using namespace std;

void rowSum(int a[][4], int nRow)
{
	for(int i = 0; i < nRow; i++){
		for(int j = 1; j < 4; j++)
		a[i][0]+=[i][j];
	}
 } 
int main()
{
	int table[3][4] = {{1, 2, 3, 4},{2, 3, 4, 5},{3, 4, 5, 6}};
	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 4; j++)
			cout<<table[i][j]<<"  ";
		cout<<endl;
	}
	rowSum(table,3);
	for(int i = 0; i < 3; i++)
		cout<<"sum of row "<<i<<" is "<<table[i][0]<<endl;
	return 0;
}

上面这一段程序先做了一个void类型的函数,用来计算一个二维数组每一行的值之和,用nRow定义行数。
之后调用函数,计算数组table每一行元素之和,然后将计算结果放入每行的第一个元素中,返回主函数后输出各行元素的和。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值