c++数组的初始化

在c++ primer fourth edition上在描述数组的初始化时,有这样一句话:

数组的维数必须用值大于等于 1 的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型 const 对象。非 const 变量以及要到运行阶段才知道其值的 const变量都不能用于定义数组的维数。

但以下测试程序在gcc编译器下,用非const常量作为数组初始化的维数也没有报错,网上查了资料,原来这是C99的标准,C89的版本是不支持非const定义数组维数的,gcc编译器内部做了优化,但没有测试VS编译器下是否通过。

	// 以下gcc编译通过
	/*const*/ unsigned int buf_size = 3;

	int int_array[buf_size];
	for( unsigned int index = 0; index != buf_size ; index++ ){
		int_array[index] = index;
	}

	for( unsigned int index = 0; index != buf_size ; index++ ){
		cout << int_array[index];
		if( index < buf_size - 1 ){
			cout << "_";
		}
	}
	cout << endl;

但是用直接初始化数组的方式却不通过编译:error: variable-sized object 'str_array' may not be initialized.

unsigned int max_size = 3;
string str_array[max_size] = {"aa", "bb", "cc"};


针对于此,显示初始化数组,无需指定维数:

string str_array[] = {"aa", "bb", "cc"};


关于字符数组:

// error: initializer-string for array of chars is too long [-fpermissive]
char arr_1[3] = "abc";		// 维数是4,相当于char arr_1[3] = {'a','b','c','\0'}, '\0'为空字符串
char arr_2[3] = {'a','b','c'};	// 维数是3


与vector不一样,数组不允许直接复制和赋值

int ia[] = {0, 1, 2};	// ok: array of ints
int ia2[] = ia;			// error: initializer fails to determine size of 'ia2'
int ia3[](ia);			// error: initializer fails to determine size of 'ia3'


对于的数组的初始化,如果没有显式提供元素初值,则数组元素会像普通变量一样初始化:

  1. 在函数体外定义的内置数组,其元素均初始化为 0;
  2. 在函数体内定义的内置数组,其元素无初始化;
  3. 不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;
  4. 如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。

















### C++ 数组初始化方法 #### 使用传统方式初始化数组 在早期版本的 C++ 中,可以使用传统的等号赋值方式进行数组初始化。例如: ```cpp int arr[] = {1, 2, 3, 4, 5}; ``` 这种方式适用于一维或多维数组,在花括号内依次指定各个元素的初始值[^2]。 #### 利用 C++11 的大括号初始化语法 自 C++11 起引入了一种新的初始化形式——统一初始化器列表(uniform initialization),即采用大括号来完成对象或容器类型的创建与填充操作。对于数组而言,这同样适用,并且能够有效防止窄化转换带来的潜在风险[^1]。 ```cpp // 单维度整型数组 std::array<int, 5> arr{{1, 2, 3, 4, 5}}; // 多维字符数组 char matrix[][8]{ {'H', 'e', 'l', 'l', 'o'}, {'W', 'o', 'r', 'l', 'd'} }; ``` 值得注意的是,当利用这种新特性时需要注意编译环境的支持情况以及具体应用场景下的差异处理。 #### 动态分配并初始化数组 除了静态声明外还可以通过 `new` 关键字动态申请内存空间从而构建可变长度的数据结构。此时既可以借助循环语句逐项赋予初值也可以直接给出完整的序列表达式作为参数传递给构造函数[^3]。 ```cpp // 创建一个含有十个未初始化整数的指针指向的一维数组 int* pia = new int[10]; for (size_t i = 0; i < 10; ++i){ *(pia+i)=static_cast<int>(pow(2,i)); } delete [] pia; ``` 上述代码片段展示了如何手动设置每一个位置上的数值;而下面的例子则体现了更简洁的做法: ```cpp auto dynamicArr = std::make_unique_for_overwrite<int[]>(7); std::fill_n(dynamicArr.get(), 7, -9); // 将七个单元格全部设为负九 ``` 这里采用了现代风格的标准库工具简化了流程设计的同时也增强了程序的安全性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值