关于指针(c++primer)

来源:互联网 发布:.top域名好优化吗 编辑:程序博客网 时间:2024/05/03 23:45

1.指针初始化和赋值操作的约束

对指针进行初始化或赋值只能使用以下四种类型的值:

1.0 值常量表达式,例如,在编译时可获得 0 值的整型const 对象或字面值常量 0。

2.类型匹配的对象的地址。

3.另一对象末的下一地址。

4.同类型的另一个有效指针。

int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得 0 值的const赋给指针:

          int ival;          int zero = 0;          const int c_ival = 0;          int *pi = ival; // error: pi initialized from int value of ival          pi = zero;      // error: pi assigned int value of zero          pi = c_ival;    // ok: c_ival is a const with compile-time value of 0          pi = 0;         // ok: directly initialize to literal constant 0

除了使用数值0或在编译时值为 0 的 const 量外,还可以使用 C++ 语言从 C 语言中继承下来的预处理器变量NULL(第 2.9.2 节),该变量在 cstdlib 头文件中定义,其值为 0。如果在代码中使用了这个预处理器变量,则编译时会自动被数值 0 替换。因此,把指针初始化为NULL 等效于初始化为 0 值:

          // cstdlib #defines NULL to 0          int *pi = NULL; // ok: equivalent to int *pi = 0;

C++ 提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址:

          double obj = 3.14;          double *pd = &obj;          // ok: void* can hold the address value of any data pointer type          void *pv = &obj;       // obj can be an object of any type          pv = pd;               // pd can be a pointer to any type

2.指针和引用的比较

虽然使用引用(reference)和指针都可间接访问另一个值,但它们之间有两个重要区别。

1.在于引用总是指向某个对象:定义引用时没有初始化是错误的。

2.赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。改变指针的值就改变了他指向的内存空间,而改变引用的值是改变了他绑定的内容


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

          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 对象,而并非引用本身。赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。



0 0
原创粉丝点击