C++中的数组你真的理解了吗

目录
  • 1 概述
  • 2 一维数组
    • 2.1 一维数组定义方式
    • 2.2 一维数组组名
    • 2.3 冒泡排序
  • 3 二维数组
    • 3.1 二维数组定义方式
    • 3.2 二维数组数组名
    • 3.3二维数组应用举例
  • 总结

1 概述

所谓数组,就是一个集合,里面存放了相同类型的数据元素。

特点1:数组中的每个数据元素都是相同的数据类型。

特点2:数组是由连续的内存位置组成的。

2 一维数组

2.1 一维数组定义方式

一共有三种

1.数据类型 数组名[数组长度];
2.数据类型 数组名[数组长度]={值1,值2,值3,...};
3.数据类型 数组名[]={值1,值2,值3,...};
#include<iostream>
using namespace std;
int main()
{
	//第一种定义数组
	int arr[5] ;
	memset(arr, 0, sizeof(arr));//初始化为0,否则为随机数
	arr[0] = 10;
	arr[1] = 10;
	arr[2] = 10;
	arr[3] = 10;
	arr[4] = 10;
	//访问数组
	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	//第二种定义数组
	//如果在初始化的时候没有填充完,剩余的会用0来填充。
	int brr[5] = { 20,20,20,20 };
	for (int i = 0; i < 5; i++)
	{
		cout << brr[i] << " ";
	}
	cout << endl;
	//第三种定义数组
	char crr[] = { '3','3','3','3','c'};
	for (int i = 0; i < 5; i++)
	{
		cout << crr[i] << " ";
	}
	system("pause");
	return 0;
}
  • 第一种方法是先声明再定义,对于全局/静态数组(定义在main()之外的数组),数组内容自动初始化为0。如果是局部的,此时数组的各元素是随机数,这时可以用 memset(arr, 0, sizeof(arr)); 使所有元素初始化为0;
  • 第二种方法是在定义的时候直接初始化,这时如果在初始化的时候没有填充完,剩余的会用0来填充。
  • 第三种方法在定义的时候不指定长度,这时会默认数组长度是你所赋的值的数量。

如果引用的索引超出了数组长度,也可以输出,输出结果是随机数(int型数组)/ 问号(char型)。

2.2 一维数组组名

一维数组组名用途:

  • 可以统计整个数组在内存中的长度。
  • 可以获取数组在内存中的首地址。

注意:数组名是常量,不可以像更改数组元素那样更改数组名

#include<iostream>
using namespace std;
int main()
{
	//1.统计内存
	int arr[5] = { 1,2,3,4,5 };
	cout << "整个数组占用内存空间为:" << sizeof(arr) << endl;
	cout << "每个元素占用内存空间为:" << sizeof(arr[0]) << endl; //元素内存相同,所以只看一个就可以了。
	//2.查看数组首地址
	cout << "数组的首地址为(十六进制):" << arr << endl;
	cout << "数组的首地址为(十进制):" << (int)arr << endl;
	cout << "数组的第一个元素地址为(十进制):" << (int)&arr[0] << endl;
	cout << "数组的第二个元素地址为(十进制):" << (int)&arr[1] << endl;
	//会发现差4个字节,就是一个整型数组的内存大小。
	//3.数组名是常量,不可以想更改数组元素那样更改数组名
	//arr=crr
	system("pause");
	return 0;
}

练习案例1

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 300,350,200,400,250 };
	int size = sizeof(arr) / sizeof(arr[0]);
	int max = 0;
	for (int i = 0; i < size; i++)
	{
		if (arr[i] > max) { max = arr[i];}
	}
	cout << "最重的小猪体重为:" << max << endl;
	system("pause");
	return 0;
}

练习案例2

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 1,3,5,9,4 };
	int size = sizeof(arr) / sizeof(arr[0]);
	int start = 0;
	int end = size - 1;
	int temp = 0;
	//打印逆置前的数组
	cout << "数组逆置前:" << endl;
	for (int i = 0; i < size; i++)
	{
		cout << arr[i] << " ";
	}
	//逆置
	while (start < end)
	{
		temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}
	//打印逆置后的数组
	cout << "数组逆置后:" << endl;
	for (int i = 0; i < size; i++)
	{
		cout << arr[i] << " ";
	}
	system("pause");
	return 0;
}

2.3 冒泡排序

作用:最常用的排序算法,对数组内元素进行排序。

方法

  • 比较相邻的元素。如果第一个比第二 个大, 就交换他们两个。
  • 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
  • 重复以上的步骤,每次比较次数-1,直到不需要比较

例如:排序{4,2,8,0,5,7,1,3,9}

#include<iostream>
using namespace std;
int main()
{
	int arr[] = { 4,8,0,5,7,1,3,0};
	int size = sizeof(arr) / sizeof(arr[0]);
	//打印排序前的数组
	cout << "数组排序前:" << endl;
	for (int i = 0; i < size; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	//冒泡排序
	for (int i = 0; i < size-1; i++)  //从0开始,共有size-1轮
	{
		for (int j = 0; j + i < size  - 1; j++) //每轮的比较次数与当前轮数相加小于size-1
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j + 1] = temp;
			}
		}
	}
	cout << "数组排序后:" << endl;
	for (int i = 0; i < size; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}

3 二维数组

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

3.1 二维数组定义方式

1.数据类型 数组名[行数][列数];
2.数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}};
3.数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4};
4.数据类型 数组名[][列数]={数据1,数据2,数据3,数据4};

一般都是使用第二种,因为第二种最直观,提高代码的可读性。

#include<iostream>
using namespace std;
int main()
{
	//1.数据类型 数组名[行数][列数];
	//2.数据类型 数组名[行数][列数] = { {数据1,数据2},{数据3,数据4} };
	//3.数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 };
	//4.数据类型 数组名[][列数] = { 数据1,数据2,数据3,数据4 };
	//1.
	int arr[2][3];
	arr[0][0] = 0;
	arr[0][1] = 1;
	arr[0][2] = 2;
	arr[1][0] = 3;
	arr[1][1] = 4;
	arr[1][2] = 5;
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << arr[i][j] << "\t";
		}
		cout << endl;
	}
	cout << endl;
	//2.
	int brr[2][3] =
	{
		{1,2,3},
	    {4,5,6}
	};
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << brr[i][j] << "\t";
		}
		cout << endl;
	}
	cout << endl;
	//3.
	int crr[2][3] = { 1,2,3,4,5,6 };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << crr[i][j] << "\t";
		}
		cout << endl;
	}
	cout << endl;
	//4.
	int drr[][3] = { 1,2,3,4,5,6 };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << drr[i][j] << "\t";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

3.2 二维数组数组名

查看二维数组所占内存空间或者某行占用内存空间

#include<iostream>
using namespace std;
int main()
{
	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;
	int row = sizeof(arr) / sizeof(arr[0]);
	int column = sizeof(arr[0]) / sizeof(arr[0][0]);
	cout << "数组的行数为:" << row << "\n" << "数组的列数为:" << column << endl;
	cout << "二维数组的首地址是(16进制):" << arr << endl;
	cout << "二维数组的首地址是(10进制):" << (int)arr << endl;
	cout << "第一行首地址是(10进制):" << (int)arr[0] << endl;
	cout << "第二行首地址是(10进制):" << (int)arr[1] << endl;
	//会发现第一行和第二行差12,正好三个整型元素
	cout << "第二行第一个元素地址是(10进制):" << (int)&arr[1][0] << endl;//直接使用arr[1][0]是查看这个元素内容,需要用&取地址。
	system("pause");
	return 0;
}

3.3二维数组应用举例

#include<iostream>
using namespace std;
//vs快捷键crtl+d可以直接把本行复制到下行
int main()
{
	int arr[3][3] =
	{
		{100,100,100},
		{90 ,50 ,100},
		{60, 70 ,80 }
	};
	cout << "成绩情况为:" << endl;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
	string names[3] = { "张三","李四","王五" };
	for (int i = 0; i < 3; i++)
	{
		int sum = 0;
		for (int j = 0; j < 3; j++)
		{
			sum += arr[i][j];
		}
		cout << names[i] << "的总成绩为:" << sum << endl;
	}
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++数组放在main函数内外的区别

    目录 思路 错误代码 正确代码 问题分析 总结 先来看一道小题,第十届蓝桥杯省赛C++/B组填空题第三题 试题 C:数列求值 本题总分:10 分 [问题描述] 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和.求第 20190324 项的最后 4 位数字. [答案提交] 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分. 思路 显然,

  • C++二维数组螺旋加密信息

    由题目要求可知 题目要求先创建一个r行c列的矩阵 然后输入一串字符串 字符串长度肯定小于r*c/5 由A C M的表示方式可以看出每个字符由5位的二进制位系统表示(无符号位) 那么我们首先可以先创建一个字符串类型 string a; cin>>a; rt 字母表示它是26字母表中第几个字母 很多人第一时间想用数组11对应 或者switch语句选择 但转念一想就知道太麻烦了 所以这里用字符的ASCII码减去64来表示它的数字形式 转ASCII码都知道 强类型转换 由于不止一个字符 为了提高代码的

  • C++数组的定义详情

    目录 1.数组概念 2.数组的复杂声明 3.数组到指针 4.数组操作 4.1获取数组元素个数 4.2使用for循环遍历数组(C++11开始支持) 5.拓展 5.1C字符串 5.2vector 5.3string 6.思考 6.1思考以下代码输出什么? 6.2以下代码能够编译通过吗? 6.3在另一个文件中定义了数组,如何在该文件中定义? 上一篇讲解了类型,通过类型来开始本篇的学习: int a[10]; 上述代码中的a是什么类型呢? 相信很多人都知道是一个数组类型,具体来说是一个int[10]的类

  • C++如何用数组模拟链表

    目录 前言 1.单链表 2.双链表 总结 前言 链表是指由一系列储存在非连续储存空间 结点组成的储存结构.每个结点由两部分组成:一是储存元素的数据域,一是储存下一个节点地址的指针域.用数组模拟链表可以十分清晰明了地理解这一定义. 在这里,我们简单地介绍一下单链表和双链表两种链表以及用数组模拟实现它们的方式. 1.单链表 单链表是指针方向单向的链表,即a结点的指针域储存着b结点的地址,而b结点的指针域内没有储存a结点的地址.在访问时,可以由a到b访问,而不能由b到a访问. 如图可以清晰地看到,各个

  • C++数组和指针的区别与联系

    目录 1 数组和指针的概念 2 数组和指针的操作 2.1 赋值 2.2 存储 2.3 大小 2.4 初始化 3 数组和指针的传参 3.1 数组的传参 3.2 指针的传参 4 总结 前言: 一直以来,有很多地方在说到数组和指针时都会说数据就是指针,这种观点也被越来越多的人接受.本文将主要介绍数组和指针.是不是一样的大家自己理解.如此而已…… 1 数组和指针的概念 数组:具有固定大小和连续内存空间的相同数据集合.里面的存储的元素具有地址连续性和数据类型相同的特点.指针:是指存放内存地址的变量.从0开

  • C++中的数组你真的理解了吗

    目录 1 概述 2 一维数组 2.1 一维数组定义方式 2.2 一维数组组名 2.3 冒泡排序 3 二维数组 3.1 二维数组定义方式 3.2 二维数组数组名 3.3二维数组应用举例 总结 1 概述 所谓数组,就是一个集合,里面存放了相同类型的数据元素. 特点1:数组中的每个数据元素都是相同的数据类型. 特点2:数组是由连续的内存位置组成的. 2 一维数组 2.1 一维数组定义方式 一共有三种 1.数据类型 数组名[数组长度]; 2.数据类型 数组名[数组长度]={值1,值2,值3,...};

  • C++中的函数你真的理解了吗

    目录 1 概述 2 函数的定义及调用 3 值传递 4 函数的常见形式 5 函数的声明 6 函数的分文件编写作用:让代码结构更加清晰 1. 2. 3. 4. 总结 1 概述 作用:将一段经常使用的代码进行封装起来,减少重复代码. 一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能. 2 函数的定义及调用 函数的定义一般主要有5个步骤: 1.返回值类型:一个函数可以返回一个值,需要知道这个值的类型. 2.函数名:给函数起个名字. 3.参数表列:使用该函数时,传入的数据. 4.函数体语句:花

  • 你真的理解C语言qsort函数吗 带你深度剖析qsort函数

    目录 一.前言 二.简单冒泡排序法 三.qsort函数的使用 1.qsort函数的介绍 2.qsort函数的运用 2.1.qsort函数排序整型数组 2.2.qsort函数排序结构体 四.利用冒泡排序模拟实现qsort函数 五.总结 一.前言 我们初识C语言时,会做过让一个整型数组按照从小到大来排序的问题,我们使用的是冒泡排序法,但是如果我们想要比较其他类型怎么办呢,显然我们当时的代码只适用于简单的整形排序,对于结构体等没办法排序,本篇将引入一个库函数来实现我们希望的顺序. 二.简单冒泡排序法

  • ES6中的数组扩展方法

    form 转化为真正的数组 先说一下使用场景,在Js中,我们要经常操作DOM,比如获取全部页面的input标签,并且找到类型为button的元素,然后给这个按钮注册一个点击事件,我们可能会这样操作: var inputObjs=document.getElementsByTagName('input'); for(var i=0;i<inputObjs.length;i++){ if(inputObjs[i].type==='button'){ inputObjs[i].onclick=func

  • JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象 Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维数组的功能 1.1 定义数组 声明有10个元素的数组 复制代码 代码如下: var a = new Array(10); 此时为a已经开辟了内存空间,包含10个元素,用数组名称加 [下标] 来调用,例如

  • PHP 数组遍历顺序理解

    比如: <?php$arr['laruence'] = 'huixinchen';$arr['yahoo']    = 2007;$arr['baidu']    = 2008;foreach ($arr as $key => $val) {//结果是什么?} 又比如: <?php$arr[2] = 'huixinchen';$arr[1]  = 2007;$arr[0]  = 2008;foreach ($arr as $key => $val) {//现在结果又是什么?} 要完

  • C#中的数组作为参数传递所引发的问题

    原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这个数据的调用者不会改变其值. 如果参数在使用过程中被意外修改,将会带来不可预知的结果,而且这种错误很难被检查到,所以我们在设计方法参数的时候,要充分考虑传递引用类型参数或者引用方式传递引用类型参数可能带来的后果. 如果一个数据在传递过程中不能被改变,就要在构建这个对象的时候就使其值(字段或属性)不被改变. 一.对于简单的参数的控制 1.值类型参数传递 这种情况因为传递的是参数的副本,不影响原始值,

  • Javascript中的数组常用方法解析

    前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.周五啦,博主的心又开始澎湃了,明儿个周末有木有,又可以愉快的玩耍了. 创建数组 创建数组的基本方式有两种,一种字面量,另一种使用构造函数创建: var arr = [1,2,3]; //字面量的形式创建数组 值与值之间用英文逗号隔开 var arr = [1,2,3]; //字面量的形式创建数组 值与值之间用英文逗号隔开 var ar

  • 详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)

    Numpy中提供了concatenate,append, stack类(包括hsatck.vstack.dstack.row_stack.column_stack),r_和c_等类和函数用于数组拼接的操作. 各种函数的特点和区别如下标: concatenate 提供了axis参数,用于指定拼接方向 append 默认先ravel再拼接成一维数组,也可指定axis stack 提供了axis参数,用于生成新的维度 hstack 水平拼接,沿着行的方向,对列进行拼接 vstack 垂直拼接,沿着列的

  • 一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearray 其实把以上类型都说成是数组是不准确的.这里把数组当作一个广义的概念,即把列表.序列.数组都当作array-like数据类型来理解. 注意本文所有代码都是在Python3.7中跑的^_^ 0x00 可变的动态列表list list应该是Python最常用到的数组类型了.它的特点是可变的.能动态扩容,可存储

随机推荐