关于指针(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
- 关于指针(c++primer)
- C++primer 指针(二)
- 第二遍C++primer->关于指针与const
- 指针和数组(c++primer)
- C++primer(六) 数组和指针
- C++primer 4.2 指针(上)
- C++Primer--数组、指针
- C++primer 4.4 数组指针和指针数组(转)
- c++primer 2/27----指针
- C++primer 指针学习笔记
- C++Primer 数组和指针
- 【C Primer Plus】第十章 数组和指针(一)
- 【C Primer Plus】第十章 数组和指针(二)
- 指向函数的指针(自C++Primer )
- c++primer学习笔记(4.2)指针的引入
- C primer plus第10章(指针)习题
- C++Primer笔记(包含string、vector和数组指针)
- C++Primer笔记3(第四章-数组和指针)
- 北京九环路
- 设置定时,任务:AlarmManager
- spring基础学习-简单实例(二)
- ListView高效分页方法
- getchar函数讲解legend
- 关于指针(c++primer)
- Ubuntu下安装 Mono
- 算法——数学
- GCC的简单指令
- 用c++实现win32事件对象,同步线程
- 深入理解debuginfo
- C语言中声明及定义的区别:【C专家编程】
- UVA 11987 第一次并查集
- Android四大基本组件