在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 initialize
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、如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。
有一种方法,就是先输入数组中数的数量
#include
#include
int *a,count=0;
scanf("%d",&count);
a=(int *)malloc(sizeof(int)*count); //free(a);
for(int i=0;i
......
free(a); //用完数组a 用这句来释放内存
通常这样写:
#include
using namespace std;
main()
{
int num,i;
int *A;
cout<<"输入数组的大小"<
A = new int [num];
cout<<"输入数组的元素"<
cin>>A[i];
for(i = 0 ; i < num ; i++)
cout< delete [] A;
}
vc tub-c 规定数组的下标不能是变量,动态分配就可以了。
所以如下代码是不正确的:
#include
using namespace std;
main()
{
int num,i;
cout<<"输入数组的大小"<
int A[num];
cout<<"输入数组的元素"<
cin>>A[i];
for(i = 0 ; i < num ; i++)
cout<
}
如果你用的编译器比较新,比如g++ 上述代码也是正确的,为了带来不必要的麻烦,最好还是别这样写。