【fishing-pan:https://blog.csdn.net/u013921430转载请注明出处】

前言

数组是C/C++以及各种编程语言中最常用的一种数据结构,了解数组的性质并且学会使用数组是对于程序员最基本的要求。今天给大家介绍一下数组,介绍主要分为静态数组与动态数组两部分。

  注:这里讲到的静态数组不是使用static 关键字修饰的数组,而是普通的数组,为了与后面的动态数组分离开,才说明它是静态数组。

静态数组

数组是一种复合的类型,因此在定义数组时必须显式指定数组的类型,不能使用auto关键字,静态数组的声明形如a[d]; a是数组的名字,d是数组的维度。维度说明了数组中元素的个数,因此d必须大于0。

在进行编译时,d必须是已知的,即编译器在编译时d已经是可以确定的值,因此数组的维度必须是一个常量表达式。

补充:常量表达式是指不会改变且在编译过程就能得到计算结果的表达式,显然字面值属于常量表达式。

静态数组的初始化

 int S = 10;int arr[S];          //错误,S不是常量表达式int *prr[10];        //正确,10是常量表达式const int M = 10;int A[M] = { 10 };   //正确,M是常量表达式string C = "fishing_pan";const int N = C.length();char B[N];          //错误,N不是常量表达式,因为N在运行时候才被初始化 

在上面的数组中可以看到,数组的维度必须是常量表达式。

在定义的时候可以对静态数组进行列表初始化,而进行列表初始化时,可以不声明数组的维度,如果没有声明数组的维度,那么编译器会根据初始值推测数组的大小。如果声明了维度,那么数组的初始值的数量不能超过维度,如下面的例子所示。

int arr1[4] = {0, 1, 2 };             //数组大小为4,值分别是0,1,2,0,未列出的值进行默认初始化;char arr2[] = {'P', 'A', 'N' };         //未声明大小,大小为3double arr3[4] ={0,1,2,3,4}         //错误,初始值过多

字符数组的特殊性

在字符数组的定义中,可以使用字符串字面值进行定义,这个时候要注意了,字符串默认在结尾处还有一个空字符,空字符需要占用一个位置。

从下面的例子可以看出,初始化字符数组时,可以不标明大小,这样不会出错。

char arr4[3] ="pan";     //错误,"pan"是const char[4]类型,不能用于初始化char arr4[3]char arr5[] ="pan";      //正确,arr5大小为4;

不允许拷贝和赋值

不能将数组内容拷贝给其他数组进行初始化,也不能用数组为其他数组赋值。

数组元素访问

数组元素可以用下标进行访问,也可以实现指针进行访问,需要注意的是,数组的第一个元素的编号是0,而不是1;一个100大小的数组,索引编号是0-99。

char arr5[] = "pan";char c=arr[2];          //c=’n’;

数组与指针

在C++中,数组与指针的关系非常紧密。指针一般使用取地址符来指向某一对象。同样也可以用于指向一个数组,不同的是,指针不会指向整个数组,而是指向数组中的某个位置;例如

int arr1[4] = { 0, 1, 2 };int *p = &arr1[1];            //指向arr1的第二个数;

直接将数组的名字传给指针时,默认指向数组的第一个值。

int arr1[4] = { 0, 1, 2 };int *p = arr1;            //等价于p=&arr1[],指向arr1的第1个数;

指针迭代与迭代器

当遍历数值的值时,可以使用指针进行迭代,只需移动指针即可;

int arr1[4] = { 0, 1, 2 };int *p = &arr1[1];++p;              //此时p指向arr1[2];

使用指针遍历虽然简单,但是容易出现超出范围的内存错误。因此可以使用迭代器;

 int *beg = begin(arr1);     //指向数组首元素int *ends = end(arr1);      //指向数组末尾元素的下一位while(beg!=ends)          //进行遍历。{cout<< *beg<<endl;     //解引用输出数组值。beg++;}

多维静态数组

在有些时候,为了使用方便或者观察方便,会定义多维数组,比如读取一张图像,可以用一张二维数组存储图像中对应坐标的灰度值。

多维数组其实就是元素是数组的数组,拿一个二维数组为例,第一个维度表示的是数组的大小,也就说是数组本身有多少个元素。第二个维度表示其元素的大小。

inttwodArr1[4][5];   //定义一个本身大小为4,元素大小为5的数组,共可存储20个整型数据

对于二维数组来说,我们常常把第一个维度称为行,第二个维度称为列,上式定义了一个4行5列的数组。

多维静态数组的初始化

除了一维数组中提到的注意事项外,多维数组进行初始化时,也有一个需要注意的问题。

为了方便理解,可以使用花括号将每一行括起来。

int twodArr2[4][5] = { { 0, 1, 2, 3, 4 }, {5, 6, 7, 8, 9 }, { 0, 1, 2, 3, 4 }, { 5, 6, 7, 8, 9 } };

也可以不适用花括号,由编译器自己判断;

int twodArr3[2][5]= { 0, 1, 2, 3, 4, 5, 6 };   //等价于int twodArr2[2][5] = { {0, 1, 2, 3, 4},{ 5, 6 ,0,0,0}};

注意:定义多维数组时,如果不对它进行初始化,必须标明每个维度的大小;如果进行了显式的初始化,可以不标明最高维度的大小,(也就是第一个维度,当第一个维度不标明大小,则不需进行初始化);

inttwodarr4[][][5] = { 0, 1, 2, 3, 4, 5, 6 };    //错误,需标明第二个维度的大小inttwodarr5[][5] = { 0, 1, 2, 3, 4, 5, 6 };       //正确;inttwodarr5[][5];                                         //错误,必须声明每一个维度的大小

多维数组与指针及迭代器

int twodarr[3][4];int(*p3)[5]= twodArr2;        //指向twodArr2的第一行p3= &twodArr2[1];              //指向twodArr2的第二行cout << *(*p3) << endl;            //输出为5,第二行第一个数字

可以看出,我们使用指针对数组进行迭代,当然,也可以使用迭代器;

for (auto p = begin(twodArr2); p !=end(twodArr2); p++){for(auto q = begin(*p); q != end(*p); q++){cout<< *q << " ";}cout<< endl;}
至此,静态数组讲解的差不多了,如果大家有不理解的地方,可以把上面的代码都自己写一下,就能够明白为什么。后面,会写一篇动态数组的博文。并且讲一下静态数组与动态数组的区别。

     未完.......

相关文章  细说C++中的数组之动态数组

【C++】细说C++中的数组之“静态”数组相关推荐

  1. java中的arrayList(动态数组)与静态数组

    首先,有时用数组时,常把静态数组和动态相混淆,今天来区分一下: 先写一下java中静态数组, 一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元 ...

  2. Java动态数组和静态数组详解

    前言必读 读者手册(必读)_云边的快乐猫的博客-CSDN博客  数组: 概念:数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致,不能出现混合类型 1.什么数据类型就只能储存什么数据元素,比 ...

  3. C语言数组大小极限,C中允许的最大静态数组大小是多少?

    你的大部分问题都得到了回答,但只是给出一个让我的生活更轻松的答案: 定性地,非动态分配的数组的最大大小取决于您拥有的RAM量.它还取决于阵列的类型,例如一个int可能是4个字节,而double可能是8 ...

  4. 在C 编程语言中 静态数组的替代模板,以编译方式在C ++中编译时创建静态数组...

    您可以获得的最接近的是使用C ++ 0x功能从可变参数模板参数列表初始化模板的本地或成员数组. 这当然受到最大模板实例化深度的限制,并且必须测量实际上在您的情况下显着差异. 例: template s ...

  5. 静态数组和动态数组 内存分布

    数组是程序设计中是一个非常重要的概念.数组是一个用于收集大量类似数据的容器, 以及其每一个元素能被相同处理过程迭代来处理的一个抽象体. 创建数组一般有三种方式:全局/静态范围的数组,局部变量数组,申请 ...

  6. 第六章 C语言数组_C语言数组是静态的,不能插入或删除元素

    在C语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组. 反过来说,如果数组在 ...

  7. 数组字典_VBA数组与字典解决方案第34讲:数组的传递

    大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解的是第34讲:数组的传递.在应用数组的时候,我们往往需要要把数组的值由一个数组传递给另外一个数组,就如同变量的传递一样: A=B '把B值赋给 ...

  8. java封装数组_Java封装数组之动态数组实现方法详解

    本文实例讲述了Java封装数组之动态数组实现方法.分享给大家供大家参考,具体如下: 前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数组空间不足 ...

  9. delphi数组与c语言数组不同,delphi数组间的赋值

    解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢.在函数参数中使用数组的时候,数组将被转换为指针处理 ...

最新文章

  1. 拖拽批量上传图片如何保证 顺序_使用 Eagle 探索图片管理新边界
  2. 云曦服务器,云曦南羡最新章节_云曦南羡全本小说
  3. LINQ to XML 常用操作(转)
  4. BEX5下新建任务到待办任务
  5. 20162328蔡文琛 四则运算第一周
  6. C#获取数据库表信息,列信息
  7. 51单片机实现三位十进制数加减乘除运算
  8. pytorch optim.SGD
  9. 模拟jQuery,简单仿写API
  10. JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari
  11. python基础算法面试_【归纳】面试中常见的python基础知识
  12. cmd跑绿色代码_cmd装逼代码-cmd命令,装逼
  13. 游戏编程之路 -- 《Windows游戏编程大师技巧》第一章 笔记
  14. Python3,多线程爬取某瓣小电影~ ~
  15. 如何对研发团队绩效进行考核--附各环节人员考核参考表
  16. args.verbose 的意思
  17. MySQL自增列之起始与步长
  18. Windows XP 中如何安装 pem 证书
  19. [转]Leveldb 实现原理
  20. 微型计算机cpu主要有两部分构成 他们是,【单选题】微型计算机的CPU主要由两部分构成,它们是( ) A. 内存和控制器 B. 内存和外存 C. 运算器和控制器 D. 外存和运算器...

热门文章

  1. UNIX-LINUX编程实践教程-第八章-实例代码注解-写一个简单的shell
  2. ibatis3获得总记录数,同时计算数据分页?
  3. NodeJS同步MySQL上游数据到ElasticSearch数据库中
  4. Koa入门教程之示例应用
  5. TypeScript 安装与使用
  6. 容器编排技术  - Kubernetes kubectl convert 命令详解
  7. Nacos Spring Cloud 快速开始
  8. Spring MVC国际化(i18n)和本地化(L10n)示例
  9. centos oracle sqlplus,centos 下oracle sqlplus乱码问题解决
  10. 神奇的 SQL 之团结的力量 → JOIN