第四章 数组和指针

数组的维数必须用值大于等于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,因为没有'\0'结束符,所以会一直往后面找下去)  

int main()

{

   char a[]={'a','b'};

   char *cp = a;

   while(*cp){

   cout<<*cp<<endl;

   cp++;

   }

    return 0;

}

 

要想正常的话,两种办法.

办法1:

int main()

{

   char a[]={'a','b','\0'};

   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;

}

posted @ 2013-08-13 10:55  CrazyCode.  阅读(139)  评论(0编辑  收藏  举报