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

《C++Primer》 学习笔记一

2018年02月11日 ⁄ 综合 ⁄ 共 1786字 ⁄ 字号 评论关闭

assert()是C 语台标准库中提供的一个通用预处理器宏。

int array0[ 10 ], array1[ 10 ];
// 错误不能直接把一个数组赋值给另一个数组
array0 = array1;

分配动态数组时一个常令人迷惑的问题是返回值只是一个指针与分配单一动态对象
的返回类型相同例如pint 与pia 的不同之处在于pia 拥有四元素数组的第一个元素的地
址而pint 只是简单地包含单一对象的地址当用完了动态分配的对象或对象的数组时我
们必须显式地释放这些内存我们可以通过使用delete 表达式的两个版本之一来完成这件事
情而释放之后的内存则可以被程序重新使用单一对象的delete 表达式形式如下
// 删除单个对象
delete pint;
数组形式的delete 表达式如下
// 删除一个对象数组
delete [] pia;

vector< int >::iterator iter = vec.begin();
将其初始值指向vec 的第一个元素iterator 是vector 类模板中用typedef 定义的类型
而这里的vector 类实例包含int 类型的元素下面的代码使迭代器指向vector 的下一个元

int *pi = &ival;
// ok: refPtr 是一个指向指针的引用
int *&ptrVal2 = pi;

const 引用可以用不同类型的对象初始化只要能从一种类型转换到另一种类型即可
也可以是不可寻址的值如文字常量例如
double dval = 3.14159;
// 仅对于const 引用才是合法的
const int &ir = 1024;
const int &ir2 = dval;
const double &dr = dval + 1.0;

我们不能使用枚举成员进行迭代如
// 不支持
for ( open_modes iter = input; iter != append; ++iter )
// ...

法相同ix_ia 的当前值被用来索引ia 然后ix_ia 被递减1
C++也支持这两个操作符的前置prefix 版本在前置形式中当前值先被递增或递减
1 然后再使用它的值因此如果写
// 错误; 两端都差一
int ix_vec = 0, ix_ia = 9;
while ( ix_vec < 10 )
ivec[ ++ix_vec ] = ia[ --ix_ia ];
则在ix_vec 的值被用来索引ivec 之前它先被递增变成1 类似地ix_ia 在被用来索引
ia 之前先被递减变成8 为了使循环能正确执行我们必须将两个索引的初始值设为一个比
实际访问的值小1 另一个比实际访问的值大1
// ok: 两端都是正确的
int ix_vec = -1, ix_ia = 10;
while ( ix_vec < 10 )
ivec[ ++ix_vec ] = ia[ --ix_ia ];
作为最后一个例子我们考虑栈stack 的设计栈是一个基本的计算机科学的数据抽
象它允许以后进先出LIFO 的顺序放入或取出数值栈的两个基本操作是向栈中压入
push 一个新的值以及从栈中弹出pop 最后的值为讨论方便假设我们用vector
来实现栈

指针数组和数组指针

指针数组,故名思义,就是指针的数组,数组的元素是指针;
    数组指针,同样,就是直想数组的指针。

    简单举例说明:

    int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。
    int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。

    其实这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。所以第一种写法,p先和[]结合,所以是一个数组,后与*结合,是指针。后一种写法同理。
    指针数组如下处理就会很清楚:
    typedef int* intPtr;
    intPtr p[2];
    一目了然,所以为了避免迷惑,做适当的typedef也是很有必要的。
    同理,数组指针也可以作类似处理:
    typedef int intArray2[2];
    intArray2 * p;
    和原来的声明都是等价的。
    
    个人建议编程过程中采用typedef来进行类型定义,这样程序看起来会清晰很多。举个例子说明:

    数组指针,元素为指向数组的指针:)
    首先,指向数组的指针为:
    typedef intArray2* intArray2Ptr;
    然后是一个数组的元素:
    typede intArray2Ptr intArray2PtrArr3[3];
    最后数组的指针:

    intArray2PtrArr3 *p;

抱歉!评论已关闭.