4.1.1 数组的定义和初始化
数组的维数必须使用值大于等于1的常量表达式定义(只能包含整形面值常量,枚举常量)。
非const变量以及要运行阶段才知道其值的const变量都不能定义数组维数。
int GetSize() { return 10; } int main() { int i=10; //int arr[i];//error: 应输入常量表达式 const int i1=GetSize(); //int arr1[i1];//error: 这里i1需要运行时才知道其值,所以不能作为数组的维数 //int arr1[GetSize()];//error: 这里也是运行时才知道值 const int i2=10; int arr2[i2];//ok int arr3[10];//ok system("PAUSE"); return 0; }
在函数体外定义的内置数组,其值均初始化为0
在函数体内定义的内置数组,其元素无初始化(测试vs2010中一直赋值为一个很小的负值)
#include <iostream> using std::cin; using std::cout; using std::endl; //在函数体外定义的内置数组,其元素均初始化为0 int arr[10]; int main() { int arr1[10]; cout<<"遍历arr:"<<endl; for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++) { //这里arr的元素都是初始值0 cout<<"第"<<i<<"个元素为"<<arr[i]<<endl; } cout<<"遍历arr1:"<<endl; for(int i=0;i<sizeof(arr1)/sizeof(arr1[0]);i++) { // cout<<"第"<<i<<"个元素为"<<arr1[i]<<endl; } system("PAUSE"); return 0; }
2.特殊的字符数组
这里需要注意是字符的空字符(结束字符串)。
#include<iostream> #include<string> using std::cout; using std::endl; using std::cin; using std::string; int main() { char chr[]={'a','b','c'};//这里没有字符串结束符\0,数组的维数是3 cout<<sizeof(chr)/sizeof(chr[0])<<endl;//输出3 cout<<"-------------1--------------"<<endl; char* chr1="abc";//这里系统添加了\0,数组维数是4 cout<<sizeof(chr1)/sizeof(chr1[0])<<endl;//输出4 for(int i=0;i<sizeof(chr1)/sizeof(chr1[0]);i++) { cout<<chr1[i]<<endl; //最后一次输出是空白 } cout<<"-------------2--------------"<<endl; char chr2[]={'a','b','c','\0'};//手动添加结束符 \0,数组维数是4 cout<<sizeof(chr2)/sizeof(chr2[0])<<endl;//输出4 cout<<"-------------3--------------"<<endl; //char chr3[3]="abc";//编译错误,这里abc\0需要4个空间的数组,而我们只给了3个 char chr4[4]="def"; cout<<sizeof(chr4)/sizeof(chr4[0])<<endl;//输出4 for(int i=0;i<sizeof(chr4)/sizeof(chr4[0]);i++) { cout<<chr4[i]<<endl; //最后一次输出是空白 } cout<<"-------------4--------------"<<endl; //闲的蛋疼,试试string类型 string str("abc"); cout<<str.size()<<endl;//这里输出3 cout<<sizeof(str)/sizeof(str[0])<<endl;//输出4,说明string自动添加了\0来结束字符 //再来试试手动添加\0给string对象 string str1("abc\0"); cout<<str.size()<<endl;//这里size没有算上我们添加的\0,输出3 cout<<sizeof(str)/sizeof(str[0])<<endl;//由于手动添加了\0,所以这里没有再自动添加\0,输出4 system("pause"); return 0; }
3.数组不能直接复制和赋值
一个数组不能用于另外一个数组的初始化,也不能将一个数组赋值给另外一个数组
int arr[]={1,2,3};
int arr1[3];
arr1=arr;//ERROR 不能直接给数组赋值
4.数组的下标
之前的vector下标类型是vector::size_type,下标从0开始,数组的下标类型则是size_t,下标也是从0
开始
#define arr_size 4 int main() { int arr[arr_size]={1,2,3,4}; for(size_t i=0;i<arr_size;i++) { cout<<arr[i]<<endl; } system("pause"); return 0; }