草庐IT

Pointers

全部标签

c++ - 在 C++ 中正确地将 `void*` 转换为整数

我正在处理一些使用外部库的代码,您可以在其中通过void*值将值传递给回调。不幸的是,之前编写此代码的人决定通过将整数转换为空指针((void*)val)来将整数传递给这些回调。我现在正在努力清理这个烂摊子,我正在尝试确定将整数转换为void*的“正确”方法。不幸的是,修复void指针的使用有点超出了我在这里能够做的返工的范围。现在,我正在执行两次转换以从/转换为void指针:static_cast(reinterpret_cast(void_p))和reinterpret_cast(static_cast(dat_val))由于我在64位机器上,直接转换((int)void_p)会导

c++ - 函数原型(prototype)和数组参数

我正在学习C++语法,并且到了要研究数组的地步。我想问你一个问题,但首先让我回顾一下,这样我就知道我把这些东西弄清楚了。我知道您可以使用以下语法将变量定义为数组:name[](大小是数组类型的一部分)。这会给我一个大小元素的基本类型数组如果我想要一个指向基类型的指针数组,我可以像普通指针声明一样在基类型说明符后面添加一个*。*name[]我无法定义引用数组,因为数组应该只包含对象(而引用只是别名)。现在,如果我想声明一个数组的引用或指针,我可以使用以下语法:(&name)[]或(*name)[]到此为止一切都清楚了。我还知道,我可以将数组作为参数传递给函数,但该调用将始终被解释为我传递

c++ - std::vector of function pointers:不同的模板参数

为什么下面会编译std::vectorfunc_ptrs;但这不是std::vectorfunc_ptrs?在第二种情况下,我收到了那些丑陋的STL错误消息之一,所以我不打算将所有内容都放在这里,但在消息的末尾我得到了这个/usr/include/c++/4.8/bits/stl_construct.h:102:30:error:ISOC++forbidsincrementingapointeroftype‘int(*)(double)’[-fpermissive]for(;__first!=__last;++__first)这似乎暗示C++将类型int(double)转换为int(*

c++ - 为什么可以在构造函数中使用成员初始化来满足显式构造函数的参数?

我很抱歉这个令人难以置信的神秘标题。我一直在阅读HerbSutter的“MoreExceptionalC++”,我遇到了一个“计数指针”的例子,我不会粘贴整个代码,但他使用了带有签名的显式构造函数:explicitcountedPointer(P*obj):p(newimpl(obj)){}进一步,他声明了一个类,这个类有一个计数指针对象作为类的私有(private)成员,在这个类的构造函数中,他这样初始化他的计数指针:flagNth(n):pimpl_(newflagNthImpl(n)){}其中,pimpl_为计数器指针对象,即countedPointerpimpl_;我尝试在ma

c++ - 空结构背后的目的?

来自C++标准库的auto_ptr声明namespacestd{templatestructauto_ptr_ref{};templateclassauto_ptr{public:typedefXelement_type;//20.4.5.1construct/copy/destroy:explicitauto_ptr(X*p=0)throw();auto_ptr(auto_ptr&)throw();templateauto_ptr(auto_ptr&)throw();auto_ptr&operator=(auto_ptr&)throw();templateauto_ptr&opera

C++结构指针问题

这可能很简单,但我正在尝试更好地理解指针。假设我有一个结构structPerson{charName[20];charID[15];charAddress[50];charNumber[15];};假设我有一堆这些存储在内存中一个接一个。所以现在我声明一个指向该结构的新指针。structPerson*ptr;这个指针会从第一个条目开始吗?(又名第一个“名称”),当我迭代它(又名ptr++)时,它会转到下一个STRUCT或下一个“条目”,也就是name-->ID--->Address例如,让我在第一个条目上说,数据是:JasonAdams111222333111FakeDrive5555

c++ - safe_ptr 实现

我正在尝试实现一个安全版本的std::shared_ptr,称为“safe_ptr”,它保证“非空性”。编辑:删除问题。如果有兴趣,请参阅编辑。将最终解决方案发布给任何感兴趣的人:此代码现在托管在googlecode上.#pragmaonce#include#include#includetemplateclasssafe_ptr{templatefriendclasssafe_ptr;public:typedefTelement_type;safe_ptr():impl_(std::make_shared()){}safe_ptr(constsafe_ptr&other):impl_

C++构造函数问题

C++programmingfortheabsoluteBeginner,2ndedition一书中,有以下声明:HeapPoint::HeapPoint(intx,inty):thePoint(newPoint(x,y)){}这是否等于:HeapPoint::HeapPoint(intx,inty){thePoint=newPoint(x,y);}而且,由于我们是在构造函数中执行此操作,因此为x和y分配的值是多少?我们应该在newPoint(x,y)中写入x和y的值吗?或者,这样是正确的?更新:我想我想到了初始化x和y,因为在书中它在一个函数中有以下内容:HeapPointmyHea

c++ - 这是 C++ 中有效的二维数组定义吗?

我刚刚在C++代码中看到类似的东西(编译并可能在VS2010中工作):int*p=newint[8,6];p[2,3]=5;这是在C++中创建多维数组的新符号吗?或者我错过了什么?据我所知,在C++中,数组是这样声明的[a][b]而不是[a,b]。如果您能解释这段代码,我们将不胜感激。谢谢。 最佳答案 这是有效的语法,但它没有指定二维数组。它使用commaoperator,所以它等同于:int*p=newint[6];p[3]=5; 关于c++-这是C++中有效的二维数组定义吗?,我们在

c++ - 调用C++成员函数指针: this-pointer gets corrupted

我需要将一些成员函数指针转换为void*指针(因为我需要将它们压入Lua堆栈,但问题与Lua无关)。我使用union来做到这一点。但是,当我将成员函数指针转换为void*并再次返回,然后尝试使用该类的实例调用该指针时,this指针会损坏。奇怪的是,如果我将void*指针转换回C风格的函数指针,并将指向该类的指针作为第一个参数,这个问题就不会发生。这是演示问题的一段代码:#includeusingnamespacestd;classtest{inta;public:voidtellSomething(){coutworks//callwithCstylefunctionpointerin