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

我的c++笔记[4]

2014年08月19日 ⁄ 综合 ⁄ 共 2112字 ⁄ 字号 评论关闭

1.    把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得0 值的 const 量赋给指针。除了使用数值0或在编译时值为 0 的 const 量外,还可以使用C++ 语言从 C 语言中继承下来的预处理器变量 NULL(必须大写;另:预处理器变量不是在 std 命名空间中定义的,因此其名字应为 NULL,而非 std::NULL)。

2.    由于指针的类型用于确定指针所指对象的类型,因此初始化或赋值时必须保证类型匹配。

3.    void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型,可以保存任意类型对象的地址。void* 指针只支持几种有限的操作:与另一个指针进行比较;向函数传递 void* 指针或从函数返回 void* 指针;给另一个 void* 指针赋值。不允许使用 void* 指针操纵它所指向的对象。

4.    指针和引用比较:虽然使用引用(reference)和指针都可间接访问另一个值,但它们之间有两个重要区别。第一个区别在于引用总是指向某个对象:定义引用时没有初始化是错误的。第二个重要区别则是赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。

考虑以下两个程序段。第一个程序段将一个指针赋给另一指针:

          int ival = 1024, ival2 = 2048;

          int *pi = &ival, *pi2 = &ival2;

          pi = pi2;    // pi now points to ival2

赋值结束后,pi 所指向的 ival 对象值保持不变,赋值操作修改了 pi 指针的值,使其指向另一个不同的对象。现在考虑另一段相似的程序,使用两个引用赋值:

          int &ri = ival, &ri2 = ival2;

          ri = ri2;    // assigns ival2 to ival

这个赋值操作修改了 ri 引用的值 ival 对象,而并非引用本身。赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。

5.    在使用下标访问数组时,实际上是对指向数组元素的指针做下标操作。只要指针指向数组元素,就可以对它进行下标操作:

intia[] = {0,2,4,6,8};

 int *p = &ia[2];     // ok: p points to the element indexed by 2

 int j = p[1];        // ok: p[1] equivalent to *(p + 1),

int k = p[-2];       // ok:p[-2] is the sameelement as ia[0]           

6.    用指针遍历数组:

          const size_t arr_sz = 5;

          int int_arr[arr_sz] = { 0, 1, 2, 3, 4 };

          // pbegin points to first element, pend points just after the last

          for (int *pbegin = int_arr, *pend = int_arr + arr_sz;

                    pbegin != pend; ++pbegin)

              cout << *pbegin << ' '; // print the current element

7.    不能使用指向const对象的指针修改基础对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指的对象。本质上说,由于没有方法分辨指向const对象的指针所指的对象是否为const,系统会把它所指的所有对象都视为const。

8.    不能保证指向const的指针所指向的对象的值是一定不可修改的,可把指向const的指针理解为“自以为指向const的指针 ”。

9.    指针本身是 const 的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。

10. 引用原文:在typedef(第 2.6 节)中使用指针往往会带来意外的结果。下面是一个几乎所有人刚开始时都会答错的问题。假设给出以下语句:

          typedef string *pstring;

          const pstring cstr;

请问 cstr 变量是什么类型?简单的回答是const pstring 类型的指针。进一步问:constpstring 指针所表示的真实类型是什么?很多人都认为真正的类型是:

          const string *cstr; // wrong interpretation of const pstring cstr

也就是说,const pstring 是一种指针,指向string 类型的const 对象,但这是错误的。

错误的原因在于将typedef 当做文本扩展了。声明const pstring 时,const修饰的是
pstring
的类型,这是一个指针。因此,该声明语句应该是把cstr 定义为指向string 类型对象的const 指针,这个定义等价于:

          // cstr is a const pointer to string

          string *const cstr; // equivalent to const pstring cstr

11. C风格字符串既不能确切地归结为 C 语言的类型,也不能归结为 C++ 语言的类型,而是以空字符 null 结束的字符数组

抱歉!评论已关闭.