数组的维数必须用值大于等于1的常量表达式定义.此常量表达式只能包含整型字面值常量、枚举常量,或者用常量表达式初始化的整型const对象.非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
注意:int staff_size=27;
double salaries[staff_size]这样是错误的.因为staff_size本身是一个非const对象,只有在运行时才能获得它的值
注意,字符数组的时候.
const unsigned array_size=2;
char ca1[array_size]="aa";
这样是错误的,因为字符串 字面值包含了aa两个显示字符,但是cal的长度必须为3才行,因为还要有一个用于存放空字符null.
数组下标越界
数组下标越界是一个程序初学者最容易犯的错误之一。
以一个简单的一维数组为例:
int a[10];这是一个整型的数组a,有10个元素:a[0]-a[9],因为正确的下标应该是从0开始,到9结束,与生活习惯中的1-10不一样,于是产生一个a[10]的错误,即数组下标越界。
c和c++语言中数组下标越界,编译器是不会检查出错误的,但是实际上后果可能会很严重,比如程序崩溃等,所以在日常的编程中,程序员应当养成良好的编程习惯,避免这样的错误发生。
若编辑网页时提示“数组下标越界”,除检查下上述问题外,再检查下文件中变量名称是否一致,很多时候是变量名称不一致所致
使用的角标大于等于数组的长度或为负数!
指针:
理解指针申明时,从右向左阅读.
string *pstring;
语句把pstring 定义为一个指向string类型对象的指针变量.类似的 int *ip1,*p2;把ip1和ip2都定义为指向int型对象的指针.
指针和Const限定符
C++强制要求指向const对象的指针也必须具有const特性.
const double *cptr;
这仅仅只是说明了cptr指向的内容是一个double的类型的.至于是不是const的无从而知.而且这个cptr的指向可以改变.只是指向内容要是double型就可以了.
然而一个const double型的变量如: const double abc.这个abc的变量.如果需要指针指向.这个指针就必须是const double *pt.的指针.
这里cptr是一个指向double类型的const对喜爱那个的指针,const 限定了cptr指针所指向的对象类型,而非cpter本身.也就是说cptr本身不是const.在定义时不需要对他进行初始化.如果需要的话,可以给cptr重新赋值.使其指向另一个const对象.但是不能通过cptr去修改对象的值.因为对象是一个cosnt对象.所以不能修改.
允许把非const对象的地址赋给指向const对象的指针.
int *const cptr这里指的指针cptr是const的,所以就必须先要初始化.和其他的类型一样const的要先初始化.
反过来int *const cptr.这里的解释是cptr是指向一个int型对象的const指针.const指针的值不能修改,也就是说不能使cptr指向其他的对象.const的指针不意味着指向的内容不能修改.因为指向的内容可能不是const.
把一个const对象的地址赋给一个普通的、非const对象的指针也会导致编译错误.
在这里:
const int a=1;
const int *const ptr=&a;//这是正确的
int *const ptr=&a;//这是错误的.因为const的变量必须由指向const变量类型的指针来指向.
*const ptr这样的指针指向的内容是可以修改的.
如:
int a=1;
int *const ptr=&a;
*ptr=2;
注意到:(以下这段代码输出的不止是a,b,因为没有' '结束符,所以会一直往后面找下去)
int main()
{
char a[]={'a','b'};
char *cp = a;
while(*cp){
cout<<*cp<<endl;
cp++;
}
return 0;
}
要想正常的话,两种办法.
办法1:
int main()
{
char a[]={'a','b',' '};
char *cp = a;
while(*cp){
cout<<*cp<<endl;
cp++;
}
return 0;
}
方法2:
int main()
{
char *cp = "ab";
while(*cp){
cout<<*cp<<endl;
cp++;
}
return 0;
}