草庐IT

Pointers

全部标签

C++ lambda 。需要如何捕获指针?

比如有一个方法:voidfoo(A*p){autol=[=](){/*DoSomethingusingp*/};//Usel...}我应该如何捕获指针:通过引用还是通过值?内部lambdap没有改变,只是使用了它的方法。 最佳答案 它是一个指针这一事实不会影响您对ref或值捕获的决定。由于指针足够小,你不想写它,你可以按值捕获。我通常使用以下规则:如果它比指针大,使用引用,因为复制可能比取消引用更昂贵如果您想从lambda外部查看更改,显然引用是唯一的选择否则(如果它很小且不会改变)按值捕获所以一个不会改变的指针应该被值捕获。如果编

c++ - 返回指向新数组的指针

指向数组的指针声明为Type(*p)[N];。例如,inta[5]={1,2,3,4,5};int(*ptr_a)[5]=&a;for(inti=0;i会输出a中的五个整数。如何将newint[5]转换为int(*p)[5]类型。例如,当我编写一个返回指向新数组的指针的函数时,以下代码无法编译。int(*f(intx))[5]{int*a=newint[5];returna;//Error:returnvaluetypedoesnotmatchthefunctiontype.}它产生:error:cannotconvert‘int*’to‘int(*)[5]’

c++ - 字符串常量在 C++ 中存在多长时间?

我一直在想,字符串常量在C++中的生命周期有多长。例如,如果我在函数内创建一些constchar*str="something",返回str的值是否安全?我写了一个示例程序,看到这样的返回值仍然存储着那个字符串,我真的很惊讶。这是代码:#includeusingnamespacestd;constchar*func1(){constchar*c="Iamastringtoo";returnc;}voidfunc2(constchar*c="I'madefaultstring"){cout它给了我以下输出:I'mastringIamastringtooI'madefaultstringI

c++ - 指针还是索引?

我有一个类似网络的数据结构,由连接在一起的节点组成。编号会改变的节点将存储在std::vector中。排名不分先后,其中Node是一个合适的类。我想跟踪节点之间的链接。同样,这些链接的数量会发生变化,我正在考虑再次使用std::vector.Link类必须包含有关它连接的两个节点的信息,以及其他链接功能。应该Link包含指向两个节点的两个指针?两个整数,用作std::vector的索引?或者我应该采用不同的系统(为什么?)第一种方法虽然可能更好,但存在问题,因为每次我在网络中添加或删除节点时都必须重新生成指针,但另一方面,这将使我摆脱例如将节点存储在随机访问容器中。

c++ - 为什么来自 Bjarne 的 "Tour of C++"的代码有效?

如果我们将一个数组传递给函数,我们将遍历它直到“p”是一个nullptr。但这永远不会发生,因为数组中最后一个值为0的元素之后的地址不是nullptr(没有零值)。这怎么可能?intcount_x(char*p,charx)//countthenumberofoccurrencesofxinp[]//pisassumedtopointtoazero-terminatedarrayofchar(ortonothing){intcount=0;while(p){if(*p==x)++count;++p;}returncount;} 最佳答案

c++ - 如何使用智能指针进行自动清理?

我正在制作一个简单的日志记录类,它带有指向std::ofstream或std::cerr的指针。有没有任何简单的方法可以使用智能指针进行自动清理,而不管使用哪个流?代码必须在clang++、g++和VS2013上编译。代码#include#include#includeclassLogger{private:std::ostream*output_stream{nullptr};boolusing_file{false};public:Logger(){output_stream=&std::cerr;using_file=false;}Logger(std::stringfile){

通过具有指向函数的公共(public)成员指针的对象调用 C++ 函数,而不使用取消引用运算符

好吧,我认为这个标题已经足够描述了(但令人困惑,抱歉)。我正在阅读这个图书馆:Timer1。在头文件中有一个指向函数的公共(public)成员指针如下:classTimerOne{public:void(*isrCallback)();//C-styleptrto`void(void)`function};存在一个TimerOne类的实例化对象,称为“Timer1”。Timer1调用函数如下:Timer1.isrCallback();这怎么正确?我熟悉使用取消引用运算符通过函数指针调用函数。例如:(*myFunc)();所以我希望通过对象进行的上述调用更像是:(*Timer1.isrC

c++ - 函数指针 - 为什么,什么时候我可以不用?

免责声明:我已经阅读了无数关于该主题的其他文章,但我仍然不明白。示例:为什么这样做:voidfunc(inta,void(*callback)(int)){/*dosomethingwithaandcallback*/callback(3);}voidpointme(intb){/*dosomethingwithb*/}intmain(){void(*pf)(int);pf=&pointme;func(10,pf);}当我可以简单地做到这一点时:voidfunc(inta){pointme(3);/*dosomethingwitha*/}voidpointme(intb){/*doso

c++ - 从指针或引用获取迭代器

我想知道是否可以通过仅访问容器内的对象来获得容器内对象的迭代器(例如std::vector),例如通过引用(这意味着我们可以使用&运算符访问指向它的指针)。例如,通常我们将迭代器声明为std::vector::iterator=vec.begin();或std::vector::iterator=next(vec.begin(),idx);但在第一个示例中,我们很可能要按顺序遍历容器,而在第二个示例中,我们知道所需对象的索引。我想知道我们是否可以在不知道对象驻留在容器中的哪个索引的情况下获得对象的迭代器,但如果我们确实有一个引用或指向它的指针,如上所述。似乎已经有人问过这个问题了her

c++ - 在 C++ 中,是否允许将函数指针转换为一个函数指针,该函数指针作为参数获取一个指向基类或派生类的指针?

以下是否会按预期工作?structA{};structB:publicA{intx;};voidf(B*o){std::coutx(f)(&b);} 最佳答案 强制转换后使用此类指针的未定义行为:Anypointertofunctioncanbeconvertedtoapointertoadifferentfunctiontype.Callingthefunctionthroughapointertoadifferentfunctiontypeisundefined,butconvertingsuchpointerbacktopoi