文章目录

  • 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. 表示数组首元素地址,指向数组第1个元素,arr + 1&arr[0] + 1会跳过第1个元素【加上1个数组元素的字节数】,指向数组的下1个元素。
  2. arr&arr[0]的地址类型为int *类型,使用int类型的指针(指向数组首元素的指针)接收。

(2) &arr

  1. 表示整个数组的地址,指向整个数组,&arr + 1会跳过整个数组【加上整个数组的总字节数】,如int *p = (int *)(&arr + 1),指针p指向数组的末尾。
  2. &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 行的地址arrarr[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]

  1. 表示二维数组首元素地址,指向二维数组第0行第0列元素, arr[0] + 1等价于&arr[0][0] + 1会在二维数组第0行跳过第1个元素【加上1个数组元素的字节数】,指向二维数组第0行的下1个元素。
  2. arr[0]&arr[0][0]的地址类型为int *类型,使用int类型的指针(指向数组第0行首元素的指针)接收。如int *p = arr[0];int *p = &arr[0][0];

(2) arr 等价于 &arr[0]

  1. 表示二维数组第0行地址,指向整个数组,arr + 1会跳过二维数组当前行【加上二维数组每行的总字节数】,如(arr + i)&a[0] + i,指向二维数组的下 i 行
  2. arr&arr[0]的地址类型为int (*)[数组列数]类型,使用数组指针(指向数组的指针)接收。如int (*p)[4] = arr;int (*p)[4] = &arr[0];

(3) &arr

  1. 表示整个二维数组的地址,指向整个二维数组,&arr + 1会跳过整个二维数组【加上整个二维数组(共m * n个元素)的总字节数】,指向数组的末尾。
  2. &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++数组(数组定义方式、数组名作用、数组地址)相关推荐

  1. Java数组的定义方式有哪几种

    今天动力节点java培训机构小编为大家分享Java数组的定义方式有哪几种,希望通过此文,大家能够熟知java数组的定义方式,下面就是小编一起看看Java数组的定义方式有哪几种呢? Java数组定义方式 ...

  2. Java静态数组和动态数组的定义方式

    数组的定义方式 静态: //简化语法常用 定义和初始化同步完成 int [] a = {5,2,6,4,10}; 动态: //数组的定义和初始化同时完成,使用动态初始化语法 int[] prices ...

  3. TypeScript学习(五):数组的定义方式及常见数组操作方法使用

    上一篇我们提到了在typescript中对于对象的定义和使用,俗话说"万物皆对象",这里我们就来说一下另一个特别的对象---数组. 在网上有很多对于数组的定义,例如:数组对象是使用 ...

  4. C语言基础入门48篇_30_二维数组的定义与使用(二维数组的定义:type 数组名[行][列]、二维数组的初始化、二维数组的引用)

    1. 二维数组的定义 type 数组名[行][列] 2. 二维数组的初始化 2.1 全部初始化为0 char chAry[2][3] = { 0 }; 实例: #include <stdio.h ...

  5. C语言数组与指针、数组的定义方式

    文章目录 前言 一.数组与指针的关系 二.C中的指针 如何定义指针呢? 三.如何用指针表示数组: 如何用指针表示数组呢? 总结 前言 楼主大一的时候学过一点C语言,但是之后一直没有用,最近用到了发现有 ...

  6. 数组(定义方式,赋值及使用数组)

    一.数组 用来将同类的数组放到一起的方法. 1.定义数组的方式 // nums是一个引用 数组的下标一般从0开始// int[] nums = {1,2,3};int[] nums1 = new in ...

  7. VB.NET 数组的定义 动态使用 多维数组

    我们都知道在全部程序设计语言中数组都是一个非常重要的概念,数组的作用是同意程序猿用同一个名称来引用多个变量,因此採用数组索引来区分这些变量.非常多情况下利用数组索引来设置一个循环,这样就能够高效地处理 ...

  8. php数组(数组的定义、使用、删除数组、数组操作符、数组排序、数组元素查找、数组的常用函数)

    什么是数组 数组是一种数据类型,在PHP中广泛应用. 数组是一个可以存储一组或一系列数值的变量. 在PHP中,数组中的元素分为两个部分,分别为键(Key)和值(Value). "键" ...

  9. java数组初始化的方式,java中初始化数组的方式有几种

    java中初始化数组的方式有几种 发布时间:2020-06-01 16:12:45 来源:亿速云 阅读:153 作者:鸽子 三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 ...

  10. C++_二维数组_定义方式_数组名称的作用_案例考试成绩统计---C++语言工作笔记021

    然后我们来看二维数组,这个跟java有一定区别.

最新文章

  1. 网关 0.0.0.0_久违的升级——全新米家智能多模网关
  2. 【ACM】杭电OJ 1004
  3. Docker 和 Kubernetes 从听过到略懂:给程序员的旋风教程
  4. 记录一下python绘制地图
  5. UIPageControl
  6. mqtt消息推送 java_MQTT+ActiveMQ实现消息推送(服务器端java实现)
  7. 7个鲜为人知却超实用的PHP函数
  8. 对于XLS碎片提取的深入研究
  9. 从头编写 asp.net core 2.0 web api 基础框架 (2)
  10. python提取cad坐标到excel_使用python来操作autocad,并且将坐标点转换成cad可见对象...
  11. zblog php 调用缩略图,缩略图插件
  12. python爬虫接口_python爬虫之百度API调用方法
  13. AD账户频繁被锁定-开启日志审核策略
  14. 选择图像根据坐标得到图像。头像裁剪器
  15. html 表格转换为dbf,怎样将Excel转换成dbf格式?
  16. java jni 生成_利用javah技术生成jni接口的详细步骤 | 学步园
  17. 学成在线-处理常见视频格式avi,mp4,mov,rmvb,flv
  18. ps 蒙版抠图更换背景色或背景图片
  19. cad线段总和lisp_autocadlisp统计多段线方法
  20. conda upgrade --all 中途退出后失败如何解决

热门文章

  1. 字节流java_Java基础教程——字节流
  2. 不同的总线结构对计算机性能影响,总线结构对计算机性能的影响
  3. B-07 Django-第二部分(熟练掌握)-模型(Model)设计-数据访问操作(记录查询-基本)
  4. 日期类Date控制台应用程序设计C#
  5. 系统设计面试题 之 如何设计Pastebin.com
  6. J2EE学习笔记----java pk .net
  7. 学习笔记之高斯过程回归(含代码):连续无限空间上建模的超级武器
  8. 揭秘!不为人知的微商引流方法······
  9. CCF认证201512-4 送货
  10. /mnt/c/Users/user/AppData/Local/Programs/Microsoft VS Code/Code.exe: Permission denied