【C++】(三)C++ 数组介绍

数组

一, 数组

C++数组是一种复合式的数据类型,用于存储连续的相同类型的数据。数组可以使用所有的 C++数据类型,如 int、 float、 double、 char、 struct等,包括类对象在内。所有的数据都存储在连续的内存空间中,位置基本固定,这使得可以方便的使用索引形式快速的访问到元素。

特点:

  • 数组中所有的数据元素的类型是一致的。
  • 数组所占的内存地址空间是连续的。

可将数组看成是存放相同数据的集合。数组根据维度可划分为一维,二维,三维…。

二, 一维数组

2.1 一维定义方式与初始化

C++中一维的语法定义如下:(有三种一维数组的定义方式)。

// 1,
Date_Type ArrayName[length];
// 2. 
Date_Type ArrayName[length] = {value1, value2, value3....}
// 3.
Date_Type ArrayName[] = {value1, value2, value3...}; 

无需把定义数组等等诸如此类的,作为教条类型的定义方法,定义数组只需catch三个要点:

  1. 指明类型 2. 编译器知道划分数组的长度 3. 命名符合规范
	// 1. 定义
	int arr[10];
	// 初始化
	for (int i = 0; i < size(arr); i++)
	{
		arr[i] = i;
	}
// 
	// 2
	int arr[4] = {1, 2, 3, 4};
	// 3
	int arr[] = {1, 2, 3, 4};
2.2 常见类型的数组
int arr[4]; // 定义了4个整型数据的数组
int arr[4] = {}; // 定义了4个整型数组,且初值赋值为0
int *arr[4]; //arr是含有4个整型指针的数组
int arr[] = {1,2,3}; //arr是含有3个整型的数组
int arr[5] = {1,2,3}; //等价于int arr[5] = {1,2,3,0,0}
string arr[3] = {"hello","world"}; //等价于 string arr[3] = {"hello","world",""};
char arr[6] = "hello"; //这里不能声明维度为5,因为字符串末尾还有一个空字符('\0'),所以应该是"hello\0"
char arr[6] = {'h','e','l','l','o','\0'}; //等价于 char arr[] = "hello";
char arr[6] = {'h','e','l','l','o'}; //这条语句和上面一条语句是一样的。默认字符初始化值是'\0'

如果在定义了整型类型的数组后,并没有对内存进行初始化的话,那么里面会存放以前的垃圾值。用字符串字面值初始化字符数组时,一定要注意字符串字面值的末尾还有一个空字符。

2.3 数组名的应用

通过数组名可以获取数组在内存中的地址。由于数组名可以获取数组在内存中的地址,这可以和指针结合起来,对数组进行操作。后续指针博文会介绍。

//数组名用途
	//1、可以获取整个数组占用内存空间大小
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	cout << "整个数组所占内存空间为: " << sizeof(arr) << endl;
	cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl;
	cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;

	//2、可以通过数组名获取到数组首地址
	cout << "数组首地址为: " << (int)arr << endl;
	cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl;
	cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl;

	//arr = 100; 错误,数组名是常量,因此不可以赋值

注意: 数组名是常量,不可以赋值。 对数组名进行sizeof,可以获取整个数组占内存空间的大小

三,二维数组

3.1 二维数组定义方式与初始化
1. Date_Type  ArrayName[ row ][ col ]; 
2. Date_Type  ArrayName[ row ][ col ] = { {value1,value2 } ,{value3,value4 } };
3. Date_Type  ArrayName[ row ][ col ] = { value1,value2,value3,value4};
4. Date_Type  ArrayName[  ][ col ] = { value1,value2,value3,数value4};

二维数组就是在一维数组上,多加一个维度。

二维数组的定义方式:

1. Date_Type ArrayName[ row ][ col ]; 
2. Date_Type ArrayName[ row ][ col ] = { {value1,value2 } ,{value3,value4 } };
3. Date_Type ArrayName[ row ][ col ] = { value1,value2,value3,value4};
4. Date_Type ArrayName[  ][ col ] = { value1,value2,value3,value4};

第一种定义方式为例:

int arr[2][3];
	arr[0][0] = 1;
	arr[0][1] = 2;
	arr[0][2] = 3;
	arr[1][0] = 4;
	arr[1][1] = 5;
	arr[1][2] = 6;
	for (int i = 0; i < size(arr); i++)
	{
		for (int j = 0; j < size(arr[i]); j++)
		{
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}

在定义二维数组的时候,也需要思考编译器是否能正确的计算出二维的行和列,如果不能,那就是你定义数组的时候,缺省了一部分。

类似于方式四,即使缺少了row,编译器可根据全部的元素计算出row,所以在定义二维数组时,如果初始化了数据,可以省略行数。

3.2二维数组名

由于二维数组可以理解为是一位数组的数组,所以二维数的数组名既可以代表是整个二维数组的首地址,也可以代表第一个元素的首地址,同时也可以代表是二维数组第一个行的地址。具体验证代码如下:

//二维数组数组名
int arr[2][3] =
{
	{1,2,3},
	{4,5,6}
};

cout << "二维数组大小: " << sizeof(arr) << endl;
cout << "二维数组一行大小: " << sizeof(arr[0]) << endl;
cout << "二维数组元素大小: " << sizeof(arr[0][0]) << endl;

cout << "二维数组行数: " << sizeof(arr) / sizeof(arr[0]) << endl;
cout << "二维数组列数: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;

//地址
cout << "二维数组首地址:" << arr << endl;
cout << "二维数组第一行地址:" << arr[0] << endl;
cout << "二维数组第二行地址:" << arr[1] << endl;

cout << "二维数组第一个元素地址:" << &arr[0][0] << endl;
cout << "二维数组第二个元素地址:" << &arr[0][1] << endl;

四,案例

4.1 一维数组案例

【冒泡排序法】

步骤:

1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
3. 重复以上的步骤,每次比较次数-1,直到不需要比较
	int arr[9] = { 3,1,6,23,5,23,5,8,89 };

	for (int i = 0; i < 9 - 1; i++)
	{
		for (int j = 0; j < 9 - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

	for (int i = 0; i < 9; i++)
	{
		cout << arr[i] << endl;
	} 

4.2 二维数组案例

案例描述:有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩

**

语文数学英语
张三100100100
李四9050100
王五607080
int scores[3][3] =
	{
		{100,100,100},
		{90,50,100},
		{60,70,80},
	};

	string names[3] = { "张三","李四","王五" };

	for (int i = 0; i < 3; i++)
	{
		int sum = 0;
		for (int j = 0; j < 3; j++)
		{
			sum += scores[i][j];
		}
		cout << names[i] << "同学总成绩为: " << sum << endl;
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值