C++Primer第5版 数组

C++Primer第5版 数组,第1张

C++Primer第5版 数组

数组是一种类似于标准库类型vector的数据结构,数组也是存放类型相同的容器,这些对象本身没有名字。需要通过位置访问,但是数组大小固定不变,不能随意向数组中添加元素。不清楚元素的个数时,用vector。

定义和初始化内存数组

  数组是一种复合类型,数组的声明如a[d],其中a是数组的名字,d是数组的维度。维度说明元素个数必须大于0,数组中元素个数也属于数组类型的一部分。维度必须为一个常量表达式。

WARNING:和内置类型一样,如果在函数内部定义了某种内置类型的数组,那么默认初始化会令数组含有未定义的值。

定义数组时必须指定数组的类型,不允许用auto关键字由初始值列表推断类型,与vector一样数组的元素应为对象,因此不存在引用类型的数组。

显示初始化数组元素

数组列表初始化会忽略数组的维度。声明时没有指明维度,编译器会根据初始值的数量计算并推测出来,如果指明了维度,那么不应超出指定数量。如果维度比初始值数量大,剩下的元素被初始化成默认数。

字符数组的特殊性

字符串数组可以用字符串字面值对数组初始化,使用这种方法是,字符串字面值的结尾出还有一个空字符,这个空字符也会像其他字符一样被拷贝到字符数组中去。

char a[3]={'a','b','c'};//列表初始化 没有空字符

char b[3]="abc";//错误 字符串字面值初始化数组 最有还有一个

数组不能拷贝和赋值

访问数组元素

数组下标通常定义为size_t类型,是一种机器相关的无符号类型,他被设计的足够大以便能表示内存中任意对象的大小,在cstddef头文件中定义了size_t类型

指针和数组

使用数组时编译器会把它转换成指针

通常情况下,使用&来获取某个对象的指针,数组元素也是对象,对数组使用下标运算符得到该数组指定元素的位置,对数组的元素使用&就能得到指向该元素的指针。

数组的 *** 作实际上是指针的 *** 作,用auto推断得到的是指针。

decltype关键字得到数组的返回类型时是数组。

指针也是迭代器

          vector和string的迭代器支持的运算,数组的指针全部支持。

C++11引入了两个begin和end的函数,他们与容器中同名功能类似,它们不是类类型,正确使用是将数组作为他们的参数。

begin(ia)返回ia首元素的指针,end(ia)返回指向ia尾元素下一位置的指针。

它们被定义在iterator头文件中。

尾后指针不能进行解引用和递增 *** 作。

指针运算

            给一个指针加减某整数,结果依旧是指针。新指针指向的元素与原来相比指针前进(后退)了整数的位置

与迭代器相同,两个指针相减的结果时他们之间的距离参与运算的指针必须是指向同一个数组当中的元素。

两个指针相减结果的类型是一种名为ptrdiff_t类型,与size_t一样也是定义在cstddef头文件中的机器相关类型。因为差值可以为负值,所以是一种带符号类型。

下标和指针

  数组名其实是用的一个指向数组首元素的指针。

只要是指针指向的是数组的元素,都可以执行下标 *** 作。

string与vector都能执行下标运算,但是数组与他们有所不同,标准库类型的下标必须是无符号类型,但是内置下标运算可以处理负值,但是结果地址必须指向原来指针所指统一数组中的元素。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5714959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存