C++数组(数组定义方式、数组名作用、数组地址)
文章目录
- 1 数组概述
- 2 一维数组
- 2.1 一维数组定义方式
- 2.2 一维数组数组名
- 2.2.1 一维数组名称的作用
- 2.2.2 一维数组名的2种特例情况
- 2.3 一维数组的地址
- 2.4 冒泡排序
- 3 二维数组
- 3.1 二维数组定义方式
- 3.2 二维数组数组名
- 2.3 二维数组的地址
1 数组概述
数组是一个集合,用于存放相同类型的数据元素。
特点1:数组中的每个数据元素具有相同的数据类型。
特点2:数组占用一段连续的内存空间。
2 一维数组
2.1 一维数组定义方式
注1:数组名的命名规范与变量名命名一致,且数组名不能与变量重名。
注2:数组的下标/索引从0
开始。
一维数组定义的3种方式:
(1)数据类型 数组名[ 数组长度 ];
注:定义数组时,若未给定数组元素的初始值,则必须指定
初始数组长度
,否则提示错误:“不允许使用不完整的类型”。
(2)数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
注:数组初始化时,若大括号{ }内的元素个数小于定义的数组长度,则剩余数组元素
默认使用 0 填充
。
(3)数据类型 数组名[ ] = { 值1,值2 ...};
注:定义数组元素初始值时,数组可以不指定初始数组长度。
示例:
int main() {//定义方式1:数据类型 数组名[元素个数];int arr[10];//使用数组下标对数组元素进行赋值或访问arr[0] = 10;arr[1] = 20;arr[2] = 30;//定义方式2:数据类型 数组名[元素个数] = {值1,值2 ,值3 ...};//若大括号{ }内的元素个数小于定义的数组长度,则剩余数据默认使用0填充int arr2[10] = { 100,90,80,70,60,50,40,30,20,10 };//定义方式3://数据类型 数组名[] = {值1,值2 ,值3 ...};int arr3[] = { 100,90,80,70,60,50,40,30,20,10 };return 0;
}
2.2 一维数组数组名
2.2.1 一维数组名称的作用
(1)统计整个数组的长度,例:sizeof(arr) / sizeof(arr[0]);
数组占用内存空间大小:
sizeof(arr)
数组单个元素占用内存空间大小:sizeof(arr[0])
数组长度:sizeof(arr) / sizeof(arr[0])
(2)获取数组在内存中的首地址,例:arr。
获取数组首地址:
arr
或&arr[0]
。
注:
arr
或&arr[0]
:数组首元素的地址 ;
&arr
:整个数组的地址【地址值相同,含义不同】。
2.2.2 一维数组名的2种特例情况
一维数组名不表示数组首元素地址的两种特例:
①sizeof(数组名)
:整个数组的大小;
②&数组名
:整个数组的地址(地址值与首元素地址相同,但意义不同),表示数组指针。
注:其它情况下,一维数组的数组名均表示数组首元素地址,等价于相应的指针类型。
示例:
int main() {//数组名用途//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; //17431292 cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl; //17431292cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl; //17431296//arr = 10; //错误:数组名是常量,不可赋值return 0;
}
注1:数组名是常量,不能进行赋值,否则报错:表达式必须是可修改的左值。
注2:对数组名使用sizeof,可获取整个数组占内存空间的大小。
2.3 一维数组的地址
【以整型一维数组int arr[n]
为例】
(1) arr
等价于 &arr[0]
- 表示数组首元素地址,指向数组第1个元素,
arr + 1
或&arr[0] + 1
会跳过第1个元素【加上1个数组元素的字节数】,指向数组的下1个元素。 arr
或&arr[0]
的地址类型为int *
类型,使用int类型的指针(指向数组首元素的指针)接收。
(2) &arr
- 表示整个数组的地址,指向整个数组,
&arr + 1
会跳过整个数组【加上整个数组的总字节数】,如int *p = (int *)(&arr + 1)
,指针p指向数组的末尾。 &arr
的地址类型为int (*)[数组长度]
类型,使用数组指针(指向数组的指针)接收。
示例:
#include <iostream>
using namespace std;int main() {//一维数组int arr[5] = { 1,2,3,4,5 };/* 一维数组的地址与指针 */int* p1 = (int *)(&arr + 1); //&arr:整个数组的地址 //&arr + 1:指向数组的末尾处int* p2 = (int*)(arr + 1); //arr等价于&arr[0],类型为int *类型:数组首元素地址 cout << p1[-2] << endl; //4cout << *p2 << endl; //2cout << arr << endl; //009DFBB8cout << *arr << endl; //1【第1个元素值】cout << arr + 1 << endl; //009DFBBC 后移4字节【跳过1个元素】cout << *(arr + 1) << endl; //2【第2个元素值】cout << &arr[0] << endl; //009DFBB8cout << *(&arr[0]) << endl; //1【第1个元素值】cout << &arr[0] + 1 << endl; //009DFBBC 后移4字节【跳过1个元素】cout << *(&arr[0] + 1) << endl; //2【第2个元素值】cout << &arr << endl; //009DFBB8cout << *(&arr) << endl; //009DFBB8cout << &arr + 1 << endl; //009DFBCC 后移4*5=20字节【跳过整个数组】cout << *(&arr + 1) << endl; //009DFBCCreturn 0;
}
2.4 冒泡排序
作用: 常用的排序算法,对数组内元素进行排序,时间复杂度O(n2)。
步骤:
(1)比较相邻元素:若前一个元素大于后一个元素,则交换两元素;
(2)针对每一对相邻元素重复执行步骤(1),执行完毕后,最大值置于数组的最末尾;
(3)重复以上步骤,每次比较的次数减少1次,直至不再需要比较。
示例: 使用冒泡排序对数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序。
int main() {int arr[] = {4,2,8,0,5,7,1,3,9};int len = sizeof(arr) / sizeof(arr[0]); //数组长度int temp;//外层循环:每轮对比的次数for (int i = 0; i < len - 1; i++) {//内层循环:进行比较的元素的索引位置for (int j = 0; j < len - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}cout << "升序排序后的数组为" << endl;for (int i = 0; i < len; i++) {cout << arr[i] << " ";}return 0;
}
3 二维数组
二维数组的每个元素均为一个一维数组,可用矩阵的形式表示。
3.1 二维数组定义方式
二维数组定义的4种方式:
(1)数据类型 数组名[ 行数 ][ 列数 ];
(2)数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2} ,{数据3,数据4} };
(3)数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
(4)数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};
注1:第(2)种定义方式更直观,可提高代码的可读性;第(3)、(4)种根据二维数组的列数推断数组元素(可省略行数,不可省略列数)。
注2:定义二维数组时,若已初始化数据,则可以省略行数。
示例:
int main() {int arr[2][3] = { {1,2,3},{4,5,6} };for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {for (int j = 0; j < sizeof(arr[i]) / sizeof(arr[i][0]); j++) {cout << arr[i][j] << " ";}cout << endl;}return 0;
}
3.2 二维数组数组名
二维数组名称的作用:
(1)计算二维数组所占内存空间
二维数组占用内存空间大小:
sizeof(arr)
二维数组第 i 行占用内存空间大小:sizeof(arr[i])
二维数组某个元素占用内存空间大小:sizeof(arr[i][j])
(2)计算二维数组的行数与列数
二维数组的行数:
sizeof(arr) / sizeof(arr[0])
二维数组的列数:sizeof(arr[0]) / sizeof(arr[0][0])
(3)获取二维数组的首地址
二维数组首地址:
arr[0]
或&arr[0][0]
二维数组第1个元素的地址:arr[0]
或&arr[0][0]
二维数组第 0 行的地址:arr
或arr[0]
或arr + 0
【或*(arr + 0)
】
二维数组第 i 行的地址:arr[i]
或arr + i
【或*(arr + i)
或&a[0] + i
】
注:
arr[0]
或&arr[0][0]
:二维数组首元素的地址 ;
二维数组名arr
:二维数组第0行(首行)的地址,等价于arr[0]
或arr + 0
(4)二维数组的其它地址
二维数组第 i 行首元素的地址:
arr[i]
或arr + i
或*(arr + i)
或&a[0] + i
二维数组第 i 行第 j 列元素的地址:&arr[i][j]
或*(arr + i) + j
(5)通过指针解引用访问或操作某元素:*(*(arr + i) + j)
示例:
int main() {int arr[2][3] = { {1,2,3},{4,5,6} };//二维数组占用的内存空间cout << "二维数组大小: " << sizeof(arr) << endl; //24cout << "二维数组一行大小: " << sizeof(arr[0]) << endl; //12cout << "二维数组元素大小: " << sizeof(arr[0][0]) << endl; //3//二维数组的行数与列数cout << "二维数组行数: " << sizeof(arr) / sizeof(arr[0]) << endl; //2cout << "二维数组列数: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl; //3//地址cout << "二维数组首行地址:" << (int)arr << endl; //16053988cout << "二维数组第一行地址:" << (int)arr[0] << endl; //16053988cout << "二维数组第一个元素地址:" << (int)&arr[0][0] << endl; //16053988cout << "二维数组第二行地址:" << (int)arr[1] << endl; //16054000cout << "二维数组第二个元素地址:" << (int)&arr[0][1] << endl; //16053992system("pause");return 0;
}
2.3 二维数组的地址
【以整型二维数组int arr[m][n]
为例】
(1) arr[0]
等价于 &arr[0][0]
- 表示二维数组首元素地址,指向二维数组第0行第0列元素,
arr[0] + 1
等价于&arr[0][0] + 1
会在二维数组第0行跳过第1个元素【加上1个数组元素的字节数】,指向二维数组第0行的下1个元素。 arr[0]
或&arr[0][0]
的地址类型为int *
类型,使用int类型的指针(指向数组第0行首元素的指针)接收。如int *p = arr[0];
或int *p = &arr[0][0];
。
(2) arr
等价于 &arr[0]
- 表示二维数组第0行地址,指向整个数组,
arr + 1
会跳过二维数组当前行【加上二维数组每行的总字节数】,如(arr + i)
或&a[0] + i
,指向二维数组的下 i 行。 arr
或&arr[0]
的地址类型为int (*)[数组列数]
类型,使用数组指针(指向数组的指针)接收。如int (*p)[4] = arr;
或int (*p)[4] = &arr[0];
。
(3) &arr
- 表示整个二维数组的地址,指向整个二维数组,
&arr + 1
会跳过整个二维数组【加上整个二维数组(共m * n个元素)的总字节数】,指向数组的末尾。 &arr
的地址类型为int (*)[数组行数][数组列数]
类型,使用二维数组指针(指向数组的指针)接收。如int (*p)[3][4] = &arr;
。
示例:
#include <iostream>
using namespace std;int main() {//二维数组3行4列int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};cout << &arr << endl; //00DAFB34 //整个二维数组的地址cout << &arr + 1 << endl; //00DAFB64 /后移4*3*4=48字节【跳过整个二维数组的全部12个元素】cout << arr << endl; //00DAFB34 //二维数组第0行的地址cout << arr + 1 << endl; //00DAFB44 后移4*4=16字节【跳过二维数组1行共4个元素】cout << arr[1] << endl; //00DAFB44 后移4*4=16字节【跳过二维数组1行共4个元素】cout << &arr[0] + 1 << endl; //00DAFB44 后移4*4=16字节【跳过二维数组1行共4个元素】cout << *(arr + 1) << endl; //00DAFB44 //二维数组第1行首元素的地址cout << *(arr + 1) + 1 << endl; //00DAFB48 后移4字节【跳过1个元素】cout << arr[0] << endl; //00DAFB34 //二维数组首元素地址cout << arr[0] + 1 << endl; //00DAFB38 后移4字节【跳过1个元素】cout << &arr[0][0] << endl; //00DAFB34 //二维数组首元素地址cout << &arr[0][0] + 1 << endl; //00DAFB38 后移4字节【跳过1个元素】/* 数组指针,指向数组长度为4的int数组 *///arr或&arr[0]:地址类型int(*)[4]int (*p1)[4] = arr; //正确int (*p2)[4] = &arr[0]; //正确//&arr:地址类型int(*)[3][4]int(*p)[3][4] = &arr; //正确return 0;
}
C++数组(数组定义方式、数组名作用、数组地址)相关推荐
- Java数组的定义方式有哪几种
今天动力节点java培训机构小编为大家分享Java数组的定义方式有哪几种,希望通过此文,大家能够熟知java数组的定义方式,下面就是小编一起看看Java数组的定义方式有哪几种呢? Java数组定义方式 ...
- Java静态数组和动态数组的定义方式
数组的定义方式 静态: //简化语法常用 定义和初始化同步完成 int [] a = {5,2,6,4,10}; 动态: //数组的定义和初始化同时完成,使用动态初始化语法 int[] prices ...
- TypeScript学习(五):数组的定义方式及常见数组操作方法使用
上一篇我们提到了在typescript中对于对象的定义和使用,俗话说"万物皆对象",这里我们就来说一下另一个特别的对象---数组. 在网上有很多对于数组的定义,例如:数组对象是使用 ...
- C语言基础入门48篇_30_二维数组的定义与使用(二维数组的定义:type 数组名[行][列]、二维数组的初始化、二维数组的引用)
1. 二维数组的定义 type 数组名[行][列] 2. 二维数组的初始化 2.1 全部初始化为0 char chAry[2][3] = { 0 }; 实例: #include <stdio.h ...
- C语言数组与指针、数组的定义方式
文章目录 前言 一.数组与指针的关系 二.C中的指针 如何定义指针呢? 三.如何用指针表示数组: 如何用指针表示数组呢? 总结 前言 楼主大一的时候学过一点C语言,但是之后一直没有用,最近用到了发现有 ...
- 数组(定义方式,赋值及使用数组)
一.数组 用来将同类的数组放到一起的方法. 1.定义数组的方式 // nums是一个引用 数组的下标一般从0开始// int[] nums = {1,2,3};int[] nums1 = new in ...
- VB.NET 数组的定义 动态使用 多维数组
我们都知道在全部程序设计语言中数组都是一个非常重要的概念,数组的作用是同意程序猿用同一个名称来引用多个变量,因此採用数组索引来区分这些变量.非常多情况下利用数组索引来设置一个循环,这样就能够高效地处理 ...
- php数组(数组的定义、使用、删除数组、数组操作符、数组排序、数组元素查找、数组的常用函数)
什么是数组 数组是一种数据类型,在PHP中广泛应用. 数组是一个可以存储一组或一系列数值的变量. 在PHP中,数组中的元素分为两个部分,分别为键(Key)和值(Value). "键" ...
- java数组初始化的方式,java中初始化数组的方式有几种
java中初始化数组的方式有几种 发布时间:2020-06-01 16:12:45 来源:亿速云 阅读:153 作者:鸽子 三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 ...
- C++_二维数组_定义方式_数组名称的作用_案例考试成绩统计---C++语言工作笔记021
然后我们来看二维数组,这个跟java有一定区别.
最新文章
- mysql installer图解_MySQL Installer GUI - 图解
- nginx 403 forbidden 二种原因
- 美好生活从java开始
- 什么是python自动化测试_python已经自动化了,大家一般用什么测试框架?
- java intercpt_java – 在Spring的安全性中使用intercept-url
- linux中sed或awk,Linux中sed和awk命令比较实例
- EasyUI基础入门之Pagination(分页)
- python中类的定义和使用_Python中类的定义与使用
- DELL Latitude E5400 装了PC DOS 7.1系统启动不了
- [C#] C#访问数据库的代码(Access版本)
- wps计算机打印双面输出,WPS轻松办公—-文档双面打印的两种方法
- 从头尝试小米手机root
- python自动答题助手_GitHub - SmileSmith/autoAnswer: 客户端答题工具,集成3个答题助手,包含AI自动答题,手动答题,adb控制多台手机等...
- 软件开发成本估算方法
- 台式计算机搜索不到无线信号,台式机无线搜不到怎么办
- [源码和报告分享]基于C++实现的运动会统分系统
- LoadRunner牛刀小试
- 当Linux配置zh_CN.UTF-8 ,中文还是显示乱码解决办法
- 山东春考计算机组装与维修,山东春考计算机组装与维修模拟试题(11页)-原创力文档...
- type=“hiden”的用法