C++ Primer笔记( 3.5.1)—— 定义和初始化内置数组

C++ Primer笔记( 3.5.1)—— 定义和初始化内置数组

#include<iostream>
#include<vector>
#include<string>

using std::string;
using std::vector;

/**************************************************************************/
/* 与vector相似的地方是,数组也是存放类型相同的对象的容器,这些对象本身没 */
/* 有名字,需要通过其所在位置访问。                                       */
/* 与vector不同的地方是,数组的大小确定不变,不能随意向数组中增加元素。因 */
/* 为数组的大小固定,因此对某些特殊的应用来说程序的运行时性能较好,但是相 */
/* 应地也损失了一些灵活性。                                               */
/**************************************************************************/

int main()
{
	/* ----- 例子 ----- */
	//数组中元素的个数也属于数组类型的一部分,编译的时候维度应该是已知的。
	//也就是说,维度必须是一个常量表达式。

	unsigned cnt = 42;           //不是常量表达式
	constexpr unsigned sz = 42;  //常量表达式
	int arr[10];        //含有10个整数的数组
	int *parr[sz];      //含有42个整型指针的数组
	//string bad[cnt];    //错误:cnt不是常量表达式

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

	/* ---------------- */


	/* ----- 显示初始化数组元素 ----- */
	//可以对数组的元素进行列表初始化,此时允许忽略数组的维度。
	//如果在声明时没有指明维度,编译器会根据初始值的数量计算并推测出来。

	const unsigned sz2 = 3;
	int ial[sz2] = { 0,1,2 };        //含有3个元素的数组,元素值分别是0,1,2
	int a2[] = { 0,1,2 };            //维度是3的数组
	int a3[5] = { 0,1,2 };           //等价于a3[] = {0, 1, 2, 0, 0}
	string a4[3] = { "hi", "bye" };  //等价于a4[] = {"hi", "bye", ""}
	// int a5[2] = { 0,1,2 };        //错误,初始值过多
	
	std::cout << "a2的元素为:[";
	for (auto i : a2)
		std::cout << i << ", ";
	std::cout << "]"<<std::endl;

	std::cout << "a3的元素为:[";
	for (auto i : a3)
		std::cout << i << ", ";
	std::cout << "]" << std::endl;

	std::cout << "a4的元素为:[";
	for (auto i : a4)
		std::cout << i << ", ";
	std::cout << "]" << std::endl;


	/* ------------------------------ */


	/* ----- 字符数组的特殊性 ----- */
	//字符数组有一种额外的初始化形式,我们可以用字符串字面值对此类数组初始化。
	//当使用这种方式时,一定要注意字符串字面值的结尾处还有一个空字符,这个空字符
	//也会像字符串的其他字符一样被拷贝到字符数组中去:

	char b1[] = { 'C', '+', '+' };        //列表初始化,没有空字符
	char b2[] = { 'C', '+', '+', '\0' };  //列表初始化,含有显式的空字符
	char b3[] = "C++";                    //自动添加表示字符串结束的空字符
	const char b4[7] = "Daniel";          //正确:最后的空字符还需要占用一个空间
	//const char b5[7] = "Daniel";        //错误:没有空间可以存放空字符

	/* ---------------------------- */
	
	
	/* ----- 不允许拷贝和赋值 ----- */
	//不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值:
	int c[] = { 0,1,2 };    //含有3个整数的数组
	//int c2[] = a;           //错误:不允许使用一个数组初始化另一个数组
	//a2 = a;                 //错误:不能把一个数组直接赋值给另一个数组

	/* ---------------------------- */
	

	/* -----理解复杂的数组声明----- */
	//和vector一样,数组能存放多大数类型的对象。例如,可以定义一个存放指针的数组。
	//又因为数组本身就是对象,所以允许定义数组的指针以及数组的引用。
	//在这几种情况中,定义存放指针的数组比较简单和直接,但是定义数组的指针或数组的引用就稍微复杂一点了;
	int *ptrs[10];              //ptrs是含有10个整型指针的数组
	//int &refs[10] = /* ? */;    //错误:不存在引用的数组
	int(*Parray)[10] = &arr;    //Parray指向一个含有10个整数的数组
	int(&arrRef)[10] = arr;     //arrRef引用一个含有10个整数的数组

	/* ---------------------------- */

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire丶Chicken

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值