C/C++ 关于数组的一些注意点

  开门见山地说,关于数组,有一些应该注意的点。

  数组的定义语句如下:typeName arrayName[arraySize]

  1.数组在定义的时候,不允许数组的长度是编译器未知的。即数组的长度是一个定量,不能是一个变量。arraySiz可以是一个整数(如 1、2、100),也可以是一个定量(如 已经有#defined N 10,可直接用N;C++中如果一个变量n是const,而且已经赋值,也可以使用n),还可以是一个有固定值的式子(如 8*sizeof(int))。总而言之,数组在定义的时候,必须是能知道数组长度的。

  那么,如果要根据输入的数值来定义数组的长度,该怎么办呢?有两个解决办法。

  a.首先,可以采用动态联编的方法来定义数组。在C中,可以用malloc(),在C++中,可以使用new,来动态分配内存空间给数组。常规的数组定义是在编译的时候就给它分配内存空间的,编译器必须知道数组的长度才能进行编译。现在从C++方面说,用new则是动态联编,允许在运行的时候才创建数组,所以编译的时候可以不需要指明数的长度。使用动态联编的方法如下:(new不仅可以为数组分配内存空间,也可以为指针分配内存空间,指针这里不谈,想了解的请自行百度)

int n;    //用于存放数组长度的值
cin >> n;
char *str=new char [n];    //系统寻找到一片长度为n*sizeof(char)的内存空间,创建指针str指向这                                      片内存空间的首地址

  但是,使用new应该注意在使用完数组后使用delete将该内存空间释放(delete [ ] str 注意:str为一开始指向分配空间的首地址的指针)。因为常规定义的数组分配的是栈中的内存区,使用new则从堆或者自由存储区的内存区域分配空间。如果在使用完数组后,没有及时delete掉分配的内存空间,分配的内存空间将一直被占用,即使在程序运行结束时也不会归还给内存池,导致内存泄漏,一旦内存泄漏严重了,程序将由于不断寻找更多内存而终止。

  b.其次,可以使用vector类(#include <vector>),也建议使用vector类。因为vector使用的new和delete都是自动的。相比于使用new,会比较安全。vector的动态定义如下:

int n;    //定义数值n用于存放数组长度
cin >> n;
vector <char> str(n);    //定义一个长度为n*sizeof(char)的char数组

  2.一个数组不能直接赋值给另一个数组。

  a.如果要将数组赋值给另一个(同类型的)数组,可以使用循环语句将数组的元素逐个赋值。

  b.可以使用array类(#include <array>)定义数组,但是array定义的时候如数组一样,长度不能是变量。同类型、同长度的array数组,可以直接赋值。

array<double,8> a1 = {1.0,2.0,3.0,4.5};
array<double,8> a2;
a1=a2;    //这样直接赋值是允许的

猜你喜欢

转载自blog.csdn.net/a120k96/article/details/81145150