【C++】细说C++中的数组之“静态”数组
【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++中的数组之“静态”数组相关推荐
- java中的arrayList(动态数组)与静态数组
首先,有时用数组时,常把静态数组和动态相混淆,今天来区分一下: 先写一下java中静态数组, 一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元 ...
- Java动态数组和静态数组详解
前言必读 读者手册(必读)_云边的快乐猫的博客-CSDN博客 数组: 概念:数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致,不能出现混合类型 1.什么数据类型就只能储存什么数据元素,比 ...
- C语言数组大小极限,C中允许的最大静态数组大小是多少?
你的大部分问题都得到了回答,但只是给出一个让我的生活更轻松的答案: 定性地,非动态分配的数组的最大大小取决于您拥有的RAM量.它还取决于阵列的类型,例如一个int可能是4个字节,而double可能是8 ...
- 在C 编程语言中 静态数组的替代模板,以编译方式在C ++中编译时创建静态数组...
您可以获得的最接近的是使用C ++ 0x功能从可变参数模板参数列表初始化模板的本地或成员数组. 这当然受到最大模板实例化深度的限制,并且必须测量实际上在您的情况下显着差异. 例: template s ...
- 静态数组和动态数组 内存分布
数组是程序设计中是一个非常重要的概念.数组是一个用于收集大量类似数据的容器, 以及其每一个元素能被相同处理过程迭代来处理的一个抽象体. 创建数组一般有三种方式:全局/静态范围的数组,局部变量数组,申请 ...
- 第六章 C语言数组_C语言数组是静态的,不能插入或删除元素
在C语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组. 反过来说,如果数组在 ...
- 数组字典_VBA数组与字典解决方案第34讲:数组的传递
大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解的是第34讲:数组的传递.在应用数组的时候,我们往往需要要把数组的值由一个数组传递给另外一个数组,就如同变量的传递一样: A=B '把B值赋给 ...
- java封装数组_Java封装数组之动态数组实现方法详解
本文实例讲述了Java封装数组之动态数组实现方法.分享给大家供大家参考,具体如下: 前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数组空间不足 ...
- delphi数组与c语言数组不同,delphi数组间的赋值
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢.在函数参数中使用数组的时候,数组将被转换为指针处理 ...
最新文章
- 拖拽批量上传图片如何保证 顺序_使用 Eagle 探索图片管理新边界
- 云曦服务器,云曦南羡最新章节_云曦南羡全本小说
- LINQ to XML 常用操作(转)
- BEX5下新建任务到待办任务
- 20162328蔡文琛 四则运算第一周
- C#获取数据库表信息,列信息
- 51单片机实现三位十进制数加减乘除运算
- pytorch optim.SGD
- 模拟jQuery,简单仿写API
- JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari
- python基础算法面试_【归纳】面试中常见的python基础知识
- cmd跑绿色代码_cmd装逼代码-cmd命令,装逼
- 游戏编程之路 -- 《Windows游戏编程大师技巧》第一章 笔记
- Python3,多线程爬取某瓣小电影~ ~
- 如何对研发团队绩效进行考核--附各环节人员考核参考表
- args.verbose 的意思
- MySQL自增列之起始与步长
- Windows XP 中如何安装 pem 证书
- [转]Leveldb 实现原理
- 微型计算机cpu主要有两部分构成 他们是,【单选题】微型计算机的CPU主要由两部分构成,它们是( )
A. 内存和控制器
B. 内存和外存
C. 运算器和控制器
D. 外存和运算器...
热门文章
- UNIX-LINUX编程实践教程-第八章-实例代码注解-写一个简单的shell
- ibatis3获得总记录数,同时计算数据分页?
- NodeJS同步MySQL上游数据到ElasticSearch数据库中
- Koa入门教程之示例应用
- TypeScript 安装与使用
- 容器编排技术 - Kubernetes kubectl convert 命令详解
- Nacos Spring Cloud 快速开始
- Spring MVC国际化(i18n)和本地化(L10n)示例
- centos oracle sqlplus,centos 下oracle sqlplus乱码问题解决
- 神奇的 SQL 之团结的力量 → JOIN