`

【原创】c++学习笔记三

    博客分类:
  • c++
 
阅读更多
数组和指针
现代 C++ 程序应尽量使用 vector 和迭代器类型,而避免使用低级的数组
和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。
数组的显著缺陷在于:数组的长度是固定的,而且程序员无法知道一个给定数组的长度。
数组定义中的类型名可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。
can't assign one array to another
如果必须在数组中添加新元素,程序员就必须自己管理内存:
要求系统重新分配一个新的内存空间用于存放更大的数组,然后把原数组的所有元素复制到新分配的内存空间中。
可用下标或指针来遍历数组。
在指向数组元素的指针上使用解引用操作符 *(dereferenceoperator)和自增操作符 ++(increment operator),对指针进行解引用操作,可获得该指针所指对象的值。而当指针做自增操作时,则移动指针使其指向数组中的下一个元素。
指针的概念很简单:指针用于指向对象。与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。现代 C++程序采用 vector类型和迭代器取代一般的数组、采用 string 类型取代 C 风格字符串。一个有效的指针必然是以下三种状态之一:保存一个特定对象的地址;指向某个对象后面的另一对象;或者是 0 值。
若指针保存 0 值,表明它不指向任何对象。未初始化的指针是无效的,直到给该指针赋值后,才可使用它。
避免使用未初始化的指针
C++ 语言无法检测指针是否未被初始化,也无法区分有效地址和由指针分配到的存储空间中存放的二进制位形成的地址。建议程序员在使用之前初始化所有的变量,尤其是指针。
如果必须分开定义指针和其所指向的对象,则将指针初始化为 0或NULL。因为编译器可检测出 0 值的指针,程序可判断该指针并未指向一个对象。预处理器变量不是在 std 命名空间中定义的,因此其名字应为NULL,而非 std::NULL。
由于指针的类型用于确定指针所指对象的类型,因此初始化或赋值时必须保证类型匹配。
void* 指针
C++ 提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址。
void* 表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
void* 指针只支持几种有限的操作:与另一个指针进行比较;向函数传递
void* 指针或从函数返回 void* 指针;给另一个 void* 指针赋值。
4.2.3. 指针操作
* 操作符(解引用操作符)将获取指针所指的对象,
指针和引用的比较
第一个区别在于引用总是指向某个对象:定义引用时没有初始化
是错误的。第二个重要区别则是赋值行为的差异:给引用赋值修改的是该引用所
关联的对象的值,而并不是使引用与另一个对象关联。
引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)
指向指针的指针
指针本身也是可用指针指向的内存对象。指针占用内存空间存放其值,因此指针的存储地址可存放在指针中。
C++ 语言中,指针和数组密切相关。特别是在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针.
使用指针的算术操作在指向数组某个元素的指针上加上(或减去)一个整型数值,就可以计算出指向数组另一元素的指针值.
通常,在指针上加上(或减去)一个整型数值 n 等效于获得一个新指针,该新指针指向指针原来指向的元素之后(或之前)的第 n 个元素。
C++ 允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。而计算数组超出末端位置之后或数组首地址之前的地址都是不合法的。
不能使用 void* 指针(第 4.2.2 节)保存 const 对象的地址,而必须使
用 const void* 类型的指针保存 const 对象的地址.
允许把非 const 对象的地址赋给指向 const 对象的指针
重要的是要记住:不能保证指向 const 的指针所指对象的值一定不可修改
在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指
向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修
改.
C++ 语言还提供了 const 指针——本身的值不能修改.const 指针也必须在定义时初始化.
string const s1;
const string s2;
这两个s1,s2类型是一样的,都表示const的string类型。










分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics