C++的优秀特性4:指针
(转载请注明原创于潘多拉盒子)
其实指针不是C++的特性,而是地地道道的C的特性。有人说C++继承了C的指针,实在是败笔,造成内存泄漏云云,纯粹是不懂。可以这么说,如果没有指针,C++会逊色很多,应用的场景也会大大缩小。
指针是一个变量,这个变量和一个int型的变量没有太大的不同,只是这个变量里存储的是它指向的对象的内存地址。
指针可以指向任何对象,包括内置类型(int、long、double、float等),对象类型,函数入口,甚至另外一个指针或者可以指向任何类型 。
涉及指针的操作符包括:定义指针(*)、解引用(*)、取地址(&)、取成员(->)、偏移解引用([]),偏移(+、-)、求偏移(-)。
先看看几种指针的例子:
- 指向int型变量的指针:int* p = new int(0);
- 指向对象的指针:Widget* p = new Widget();
- 指向函数的指针:int (*p)(int n) = factorial; 这里p是指向已经定义的函数factorial的函数指针。
- 指向指针的指针:Widget** pp = &p;
- 可以指向任何类型的指针:void* any = NULL; 这里的any是指向任何类型变量的指针。比如any = p; 或是any = pp; 甚至any = &pp; 都是合法的。
对于#1和#2的情况,大家应该已经比较熟悉,这里就不赘述了。
对于函数指针,在C语言实现动态方法绑定中非常有用。在C++中,更多的是通过接口虚函数覆盖(override)来代替。在某些兼容C程序动态行为绑定的例子中,可以采用函数指针。
比如我们可以根据用户输入的命令,定义对应的处理函数:
typedef bool (*command_process)(int argc, char** argv); bool start(int argc, char** argv)
{
// implementations
} bool stop(int argc, char** argv)
{
// implementations
} bool write(int argc, char** argv)
{
// implementations
} bool read(int argc, char** argv)
{
// implementations
} // assign processors to names
std::map<std::string, command_process> processors;
processors["start"] = start;
processors["stop"] = stop;
processors["write"] = write;
processors["read"] = read; // use processors to process commands
std::string command = "start";
processors[command](argc, argv); // 调用名称“start”对应的处理函数,实现动态效果
比较有意思的是可以指向任何类型的变量的指针,比如:
// 为了简单,这些变量全部定义在栈上,其实可以是new出来的
int n = 256;
double x = 3.14159265;
Widget w; // 定义一个任意指针
void* any = NULL; // 这个指针可以指向int类型的变量
any = &n; // 也可以指向double型
any = &x; // 或者是一个对象
any = &w; // 但是,如果想对该指针解引用,则必须用reinterpret_cast
Widget* pw = reinterpret_cast<Widget>(any); // 然后就可以调用了,安全性需要程序员自己保证,如果类型不对,程序可能crash。
pw->widgetMethod();
所以,除非非常必要,不要使用任意指针。
指针是可以偏移解引用的,即使这个指针不是指向一个数组头部:p[i]等价于*(p+i)。这里的i不必是非负整数,还可以是负整数。比如p[-4]是合法的。
相同类型的指针之差是合法的,比如
int* begin = new int[100];
int* end = begin+100;
int size = end - begin; // 这是合法的,size = 100,表示begin和end之间的变量的个数
C++的优秀特性4:指针的更多相关文章
- C++的优秀特性6:智能指针
(转载请注明原创于潘多拉盒子) 智能指针(Smart Pointer)是C++非常重要的特性.考虑如下一段使用简单指针(Plain Pointer)的代码: A* a = new A(); B* b ...
- C++的优秀特性1:引用
(转载请注明原创于潘多拉盒子) 一本典型的C语言教科书的厚度大约是200页左右,而一本典型的C++教科书的厚度至少要500页.比如K&R的<The C Programming Langu ...
- 总结Codeigniter的一些优秀特性
总结Codeigniter的一些优秀特性 近期准备接手改进一个别人用Codeigniter写的项目.尽管之前也实用过CI,可是是全然按着自己的意思写的,没按CI的一些套路.用在公众的项目,不妨按框架规 ...
- C++的优秀特性3:构造函数和析构函数
(转载请注明原创于潘多拉盒子) 构造函数和析构函数是C++中再熟悉不过的概念了,几乎每个了解一点C++的人都知道这两个概念是什么意思.一个对象的全部生命期中构造函数和析构函数执行的时机如下: 1. 为 ...
- C++新特性---智能指针
智能指针: 为什么需要智能指针? 1. malloc出来的空间,没有进行释放,存在内存泄漏的问题. 2. 异常安全问题.如果在malloc和free之间如果存 ...
- 分布式-信息方式-ActiveMQ的Message dispatch高级特性之(指针) Message cursors
Message dispatch高级特性之 Message cursors概述 ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的 消息 ...
- C++的优秀特性2:inline 函数
(转载请注明原创于潘多拉盒子) Inline函数是C++的一个很小的特性,在不计较效率的情况下,这个特性似乎可有可无.然而,C++天生是为最为广泛的应用场景设计的,因此,总会有关于效率的问题.其实,除 ...
- OC学习3——C语言特性之指针
1.指针是C语言中的一个非常重要的概念,实际上,OC系统类的变量.自定义类的变量等都是指针.定义指针变量的语法格式如下,其中*代表一个指针变量,整个语法代表定义一个指向特定类型的变量的指针变量.注意: ...
- [C++11新特性] 智能指针详解
动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极为困难的.有时我们会忘记释放内存产生内存泄漏,有时提前释放了内存,再使用指针去引用内存就会报错. 为了更容易(同时也更安全)地使用动态内存, ...
随机推荐
- 深入理解JavaScript闭包(closure)
最近在网上查阅了不少javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...
- FZU 2171(线段树的延迟标记)
题意:容易理解. 分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞, 然后我就一直没去碰线段树的题了 ...
- C# 中对WinForm窗体中的控件快速设置TableIndex次序
点击“视图”--“Tab键顺序”,然后便可设置.
- Oracle VirtualBox 模拟Android系统 素材
Android to x86 下载地址: http://www.android-x86.org/download VirtualBox 下载地址: https://www.virtualbox.org ...
- ID@Xbox计划宣传片 XboxOne喜迎大波小游戏(转)
微软Xbox One游戏不够多?别担心,微软的ID@Xbox计划将带来一大波独立游戏!微软在今天正式公布了即将登陆旗下的Xbox One主机平台的独立游戏阵容,数量多达32款,官方的宣传片也已放出,感 ...
- mac 配置Python集成开发环境(Eclipse +Python+Pydev)
1.下载Mac版64位的Eclipse. 进入到Eclipse官方网站的下载页面(http://www.eclipse.org/downloads/),我选择了下图所示的软件包, 浏览器在下载过程中使 ...
- seo技巧-2015/10/05
1.每页都要有它自己的文件名,并且有它自己的上级文件夹和它自己相关关键字. 2.建议在每页上使用一个的H1标签.我也试着使用许多H2 或H3的标签在页面内辅助构成正文内容. 3. 有时花费一点钱帮助你 ...
- how to install flash
Choice 1: Install Flash from Repository: This is fairly simple and easy and should work from most p ...
- ubuntu下apt-get update出现hash校验和错误
可能原因 校园网进行网络缓存导致内容滞后. 解决办法 先清除旧的apt-get更新列表 sudo rm -rf /var/lib/apt/lists/* 使用代理服务器或者VPN 重新更新 sudo ...
- 预定义宏_GNUC_ _MSC_VER
一.预定义__GNUC__宏 1 __GNUC__ 是gcc编译器编译代码时预定义的一个宏.需要针对gcc编写代码时, 可以使用该宏进行条件编译. 2 __GNUC__ 的值表示gcc的版本.需要针对 ...