• 第四章 数组和指针


    数组的维数必须用值大于等于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;

    }

  • 相关阅读:
    tree
    gridview XML
    http://jingyan.baidu.com/article/22a299b513f3db9e18376a5e.html
    tree btn
    sss rar jar
    ComponentOne Studio
    http://wpf_sl.cnblogs.com/ WPF/Silverlight深蓝团队
    ddddd
    [牛客每日一题] (前缀和+线性 DP) NC15553 数学考试
    [停更一周,我干了什么] [C++/QT] 一个基于avl树,trie树,哈希散列表的英汉词典
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3254695.html
Copyright © 2020-2023  润新知