现在的位置: 首页 > 综合 > 正文

[C++ Primer] 数组和指针

2018年04月03日 ⁄ 综合 ⁄ 共 1100字 ⁄ 字号 评论关闭

1.C++中标准库vector类似于C语言中数组的概念,当然C++中也能使用数组,但是呢C++程序应该尽量使用vector和迭代器类型,只有在设计良好的程序并强调速度时才在类实现的内部使用数组和指针。以下是部分理由:与vector类型相比,数组的缺陷在于,数组的长度是固定的,如果要更改数组的长度,程序员只能创建一个更大的数组。

2.数组的定义----数组的长度必须用值大于或等于1的常量表达式定义,非const变量以及要到运行阶段才知道其值得const变量都不能用来定义数组的长度。例如:const unsigned int sz = get_size();int vals[sz];---》sz虽然是const变量,但是其值要到运行时才知道,所以这样定义是错误的。const unsigned int max_size
= 20; int vals[max_size +1];这样定义是合法的,因为max_size+1是常量表达式,编译时即可计算出该表达式的值为21。

3.数组的初始化:没有显示提供元素初值,则数组元素会像普通变量一样初始化。在函数体外,其元素均初始化为0;在函数体内,其元素无初始化;如果元素为类类型,不管数组在哪里定义自动调用改类的默认构造函数进行初始化,如果没有默认构造函数,则必须为该数组的元素提供显示初始化??(如果没有呢或怎样)。(附:如果初始化提供的元素初值个数小于数组长度,剩下的元素,若是内置内型则初始化为0,类类型则调用默认构造函数)

4.动态数组与静态数组不同,不必再编译的时候知道数组的长度。C语言中使用malloc和free,C++中使用new和delete,另外与静态数组不同的是,如果数组元素是内置类型,则无初始化(无论定义在函数体内还是函数体外,因为存储在堆空间,注意与静态数组的区别);类类型则调用该类的默认构造函数。如果想内置内型的数组元素初始化,则需要这样定义:int
*pia = new int[10]();在数组长度后面加一对空的圆括号,表示对数组元素做初始化(
值得注意的是,动态数组的初始化只能初始化为元素类型的默认值,而不能像静态数组一样,用初始化列表为数组元素提供不同的初值)。此外,还能定义长度为0的动态数组,如char *p = new char[0],当然此时不能进行解引用操作,毕竟没有指向任何元素。

5.动态数组的释放,与C语言中free的用法不同,在释放动态数组时必须使用delete [] p;关键字delete和指针之间的方括号是必不可少的,它告诉编译器该指针指向的是数组而非单个对象,如果遗漏了[],就会导致运行时少释放了内存空间,从而产生内存泄露。

       

 

【上篇】
【下篇】

抱歉!评论已关闭.