C++入门-数组

简介: C++入门-数组

创建和使用数组

素组是一种数据格式,能储存多个同类型的值。创建数组需要声明以下三点:

  • 储存在每个元素中的值的类型
  • 数组名
  • 数组中的元素

例如:

short months[12]

typeName arrayName[arraySize]

作为复合类型的数组:数组之所以被称为复合类型,是因为他是使用其他类型创建的(C语言使用术语“派生类型”,但是由于C++对类关系使用术语“派生”所以使用复合类型来描述数组)。不能仅仅将某种东西声明为数组, 它必须有特定的类型。没有通用数组类型,但是存在很多特定的数组类型,如char数组或者long数组。如float array[20]的类型不是数组,而是“float数组”。

数组的很多用途基于以下事实

  • 可以单独访问数组元素,方法是使用下标或者索引来对元素进行编号。
  • C++的素组从0开始编号。Pascal和BASIC用户需要改变习惯了。
  • C++使用带索引的方括号表示法来指定素组元素。例如months[0]是months数组的第一个元素。

总结:数组可以使用声明创建大量的变量。

有效下标的重要性:编译器不会检查下标是否有效。在程序运行后,这种错误的赋值可能引发问题,它可能破坏数据或者代码,也可能导致程序异常终止。所以必须保证程序的下标有效。

以下代码说明了一些数组的属性:

#include<iostream>

int main()

{

   using namespace std;

   int yams[3];

   yams[0] = 7;

   yams[1] = 8;

   yams[2] = 6;


   int yamcosts[3] = {20,  30, 5};

   cout << "Total tams = " <<endl;

   cout << yams[0] + yams[1] + yams[2] <<endl;

   cout << "The package with " << yams[1] << " yams costs ";

   cout << yamcosts[1] << "cents per yam.\n";

   int total = yams[0] * yamcosts[0] + yams[1] * yamcosts[1];

   total = total + yams[2] * yams[2];

   cout << "The total  yam expense is " << total << " cents.\n";


   cout << "\nSize of yams array = " << sizeof yams;

   cout << "bytes.\n";

   cout << "Size of one element = " << sizeof yams[0];

   cout<< "bytes.\n";

   return 0;

}


/*

output:

前面的不做说明,最后两行会输出

Size of yams array = 12 bytes

Size of one element = 4 bytes

聪明的你肯定知道为什么吧

*/

数组初始化规则

C++有几条关于初始化数组的规则, 他们限制初始化的时刻,决定数组元素数目与初始化器中值的数目不相同时将发生的情况。

  • 只有在定义数组的时候才能使用初始化,此后不能使用且不能将一个数组赋值给另外一个数组

int cards[4] = {1, 2, 3, 4}

int hand[4];

hand[4] = {5, 6, 7, 8};//not allowed

hand = cards//not allowed

然而,可以使用下标分别给数组中的元素赋值

  • 初始化时,提供的值可以少于数组中的元素数目。例如只初始化数组的前两个值

float hotelTips[5] = {2.3,3.2};

如果只对数组的一部分初始化,则编译器将把其他元素设置为0,因此想要将数组中的所有元素都初始化为0非常简单--只要显式将第一个元素初始化为0,然后让编译器将其他元素初始化为0。

long totals[500] {0};

如果初始化为{1},则第一个元素为1,其他都为0

如果[]内为空,C++编译器会自动计算元素个数例如

short things[] = {1, 3, 5};//编译器会将things数组容量设置为3

通常,让编译器去计算元素个数是很糟糕的做法,因为其计数可能和你想的不一样。例如你不小心在列表中遗漏了一个值。然后,这种方法对于将字符数组初始化为一个字符串来说比较安全,很快你就会明白这一点。如果主要关心的问题是程序,而不是自己是否知道数组大小,则可以这样做:

short things[] = {1, 5, 3, 8};

int num_elements = sizeof things / sizeof(short);

C++11数组初始化方法

  • 初始化的时候可以省略🟰

double earning[4] {1.2e4, 1.6e4, 1.1e4, 1.7e4};

  • 可以不在大括号里包含任何东西,将元素都设为0

unsigned int counts[10] = {};

float balances[100] {};

  • 列表初始化禁止缩窄转换

long plifs[] = {25, 92, 3.0};//not allowed

char slifs[4] = {'h', 'i', 1122011, '\0'};//not allowed

char tlifs[4] = {'h', 'i', 112, '\0'};//allowed

扩展

C++标准库(ST L)提供了数组的替代品vector。我们在第16章介绍他们。

参考资料:C++ Prime Pluse 6

相关文章
|
4月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
48 0
|
8月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
7月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
9月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
133 5
|
12月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
125 2
C++入门12——详解多态1
|
12月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
169 1
|
12月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
104 0
|
12月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
132 0
|
12月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)