C++ Primer 学习笔记与思考_6 数组和动态数组易错点解读

1. 数组的定义

数组定义中的类型名可以是内置数据类型或者类类型;除了引用之外,数组元素的类型还可以是任意的复合类型。另外,非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。

#include <iostream>
#include <string>
#include <cstring>
#include <bitset>
using namespace std;
int main()
{
	const int MAXN1 = 5;
	int MAXN2 = 6;
	const int MAXN3 = get_size();

	int num1[MAXN1];  // ok
	int num2[MAXN2];  // error,non const variable
	int num3[MAXN3]; // error size not known until run time

	return 0;
}

虽然MAXN2使用字面值常量初始化的,但是他是一个非const对象,只有在运行的时候才能够获得他的值,因此定义维数是非法的。同理MAXN3的值也要等到运行时才能够得出get_size()。
2.数组的初始化
当我们没有显式提供数组的初值时,是怎样的初始化规则呢?
-- 在函数体外定义的内置数组,其元素均初始化为0。
-- 在函数体内定义的内置数组,其元素无初始化。
-- 不管数组在哪里定义,如果其元素类型为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组提供显示初始化。

#include <iostream>
#include <string>
#include <cstring>
#include <bitset>
using namespace std;
int a[5];
int main()
{
	
	int b[5];
	for (int i = 0; i < 5; i++)
		cout << a[i] << " ";
	cout << endl;
	for (int i = 0; i < 5; i++)
		cout << b[i] << " ";
	cout << endl;

	return 0;
}

所以在函数内部定义的数组一定要初始化,否则这些操作没有意义。
3.赋值和复制
与vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组,这些操作是非法的。

#include <iostream>
#include <string>
#include <cstring>
#include <bitset>
using namespace std;
int a[5];
int main()
{
	
	int b[5];
	b = a; //error
	return 0;
}
(一)动态数组:
动态分配的数组不必在编译的时候知道其长度,可以在运行的时候才确定长度,而且必须显式释放它。动态分配的对象存放于堆中。
动态分配的数组没有名字,只能通过其地址间接地访问堆中的对象。
此外,数组的const对象必须进行初始化,实际上,我们只要记住,定义动态数组时最好加上( )进行初始化。
如下例,当get_size()返回的n是0时,也是正确的,我们允许动态分配空数组,但是不能进行解引用操作,因为毕竟没有元素。
数组,必须用delete [] *p显式释放。 []不可少。

#include <iostream>
#include <string>
#include <cstring>
#include <bitset>
#include <algorithm>
using namespace std;
int main()
{
	int *p1 = new int[10];  //未初始化
	int *p2 = new int[10](); //初始化为0
	int num = 5;
	int *p3 = new int[num];

	const int *p4 = new const int[100];   //error,必须初始化
	const int *p5 = new const int[100](); //ok

	size_t n = get_size();
	int *p = new int[n]; //ok,but if n=0,then & is unable to use


	delete[] p;
	return 0;
}
(二)混合使用string和c风格字符串
string可以用c风格字符串初始化,但是无法用string对象初始化字符指针,可使用c_str进行转换。
  string s = "fdsafd";
	//char *p = s; // error
	const char *p = s.c_str(); //ok, return const
/ 注意,如果之后s发生改变,那么*(p+n)取出的是变化后的值
//原返回数组失效,如果想使用原数组,最好复制保存下来
(三)最后稍微提一下多维数组和指针之间的一点问题,看程序吧:

#include <iostream>
#include <string>
#include <cstring>
#include <bitset>
#include <algorithm>
using namespace std;
int main()
{
	int ia[3][4];
	int(*ip)[4] = ia; // ip points to an array of 4 ints
	//int *ip[4];  // array of points to int
	//ip = &ia[2]; 

	for (ip = ia; ip != ia + 3;ip++)
	for (int *q = *ip; q != *ip + 4; ++q)
		cout << *q << endl;
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值