栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[C++] 数组

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[C++] 数组

1. 与vector容器的区别

相同点:都是一种能存储类型相同的对象的容器。

不同点:数组的存储对象的大小是确定的,且一旦确定,后续不能超过所定大小的容量,而vector是可以随意添加元素的。

2. 定义

int A[d];    :A是数组名,d是数组所存储的维度即容量大小,注意:因为维度必须已知,所以d只能是常量表达式。一般来说d是无符号整型,C/C++,定义了新的类型size_t,它是一种机器相关的无符号类型,被设计的足够大,以便于能够表示内存中任意对象的大小,其在C++中定义在头文件#include中,寻常就使用在表示数组下标以及内存管理相关的函数中。

size_t d=10;
int A[d]; //err 因为d不是常量表达式

const size_t d=10;
int A[d]; //true

constexpr size_t d=10;
int A[d]; //true

int A[10*2-10]; //true
3. 初始化

与内置类型一样,在函数体内部定义的数组,没有进行初始化的话,所有的值都是未确定的,在函数体外部定义的数组,数组元素的值都默认初始化,比如:是int类型则初始化为0,string类型则初始化为"",等等。其余,一般初始化方式如下:

int A[4]{0,1,2,3};
int A[4]={0,1,2,3};
int A[4]={0,1,2};      // 0,1,2,3,0
string A[3]={"a","b"}; // a,b,""
char A[3]="ab"  //ab

注意:

  1. 如果初始化的长度小于数组定义的长度的话,则未初始化的值将进行默认初始化。
  2. 字符数组的初始化,如果没有显式的写出空白字符则需要为空白字符留一个位置。如:
const char ok[3]="abc"; //err 没有为空白字符留位置,因为空白字符也占一个位置
const char ok[3]="ab"; //true
4. 存储指针的数组、数组的引用、数组的指针
int arr[10];

int *ptr[10]; //存放指针的数组

int (*ptr)[10]=&arr; //指向arr的数组,注意:他们的容量必须是一样的

int (&ptr)[10]=arr; //arr数组的引用

int *(&ptr2)[10]=ptr; //存放指针的ptr数组的引用

int (*(&ptr2)[10]=ptr; //err,不存在这样的数组,因为,这是指向ptr的引用的数组,但引用不是一个对象,所以不能这样。

建议:阅读数组的复合操作时,从内往外读,如最后一个,先读括号里面的,&ptr2得它是一个引用,然后读*(&ptr2)得它是一个存放指针的数组。

5. 访问数组

一般使用范围for语句来访问数组

constexpr size_t d=3;
int A[d]{0,1,2};
for(auto &c:A)
{
    c=10;
}
6. 标准库中的begin()和end()函数

定义在头文件#include中,这里的begin()和end()函数与容器里的函数不是同一个,同名,不过功能相似,标准库里的begin()返回的是数组里的首元素的指针,end()返回是数组尾元素的下一个元素的指针。使用方式:

constexpr size_t k=3;
int A[k]={0,1,2};
int *b=begin(A);
int *e=end(A);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033956.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号