草庐IT

Pointers

全部标签

c++ - 在 C++ 中(不是在 C 中)指向具有未指定边界的数组的指针的可用情况

考虑以下代码:intmain(){int(*p)[];//pointertoarraywithunspecifiedboundsinta[]={1};intb[]={1,2};p=&a;//worksinCbutnotinC++p=&b;//worksinCbutnotinC++return0;}在纯C中,您可以将指针分配给任何维度数组的此类地址。但在C++中你不能。我发现了一种情况,编译器允许为此类指针赋值:structC{staticintv[];};intmain(){int(*p)[]=&C::v;//worksinC++if'v'isn'tdefined(onlydeclar

c++ - delete[] (ptr, 0) 的行为

是否定义了这段代码的行为?int*ptr=newint[10];operatordelete[](ptr,0);这段代码编译得很好,(在我的机器上)似乎什么也没发生。它的行为是否在某处定义? 最佳答案 在这个声明中operatordelete[](ptr,0);显式调用了释放函数voidoperatordelete[](void*,std::size_t)noexcept;调用中类型为size_t的第二个参数刚设置为0。当分配的内存大小不等于0时,第二个参数等于0的调用行为是未定义的。

c++ - 是否可以重载一个可以从指针中分辨出固定数组的函数?

动机:几乎是为了好玩,我正在尝试编写一个函数重载,它可以区分参数是固定大小的数组还是指针。doubleconstd[]={1.,2.,3.};doublea;doubleconst*p=&a;f(d);//callarrayversionf(p);//callpointerversion我发现这特别困难,因为众所周知,数组迟早会衰减为指针。一个天真的方法是写voidf(doubleconst*c){...}templatevoidf(doubleconst(&a)[N]){...}不幸的是,这不起作用。因为在最好的情况下,编译器会确定数组调用f(d)上面是模棱两可的。部分解决方案:我尝

c++ - 如何强制不修改引用变量的任何部分?

当引用某物时,可以添加额外的const限定符,以便不能修改引用的变量,如下所示:int*ptr;intconst*const&rptr=ptr;//ptrcan'tbechangedand*ptrcan'tbechanged或者像这样,使用一个数组:intarr[1];intconst(&rarr)[1]=arr;//arr[0]can'tbechanged或者甚至像这样,使用指针数组:int*ptrarr[1];int*const(&rptrarr)[1]=ptrarr;//ptrarr[0]cannotbechanged,but*ptrarr[0]canbe那么,为什么我不能将这些

c++ - 实现一个进度条类

我正在使用这本书学习C++ProgrammingPrinciplesandPracticeUsingC++.第16章介绍了通过接口(interface)库使用FLTK库的gui部分的技术。本章的练习之一是制作图片的动画,由类中实现的开始和停止按钮控制。对于计时,我发现使用FLTKsFl::add_timeout和Fl::repeat_timeout是比进入无限循环并使用Sleep()阻塞其他方法更好的解决方案回调。我没有成功地使用Fl::add_timeout和Fl::repeat_timeout实现可行的解决方案,但找到了一个示例here使用带有开始和停止按钮的进度条:#includ

c++ - 如何将 "Any kind of data"传递给 C++ 中的函数

假设我有一个Handler类,它有一些子类,例如stringhandler、SomeTypeHandler、AnotherTypeHandler。Handler类定义了一个方法“handle”作为所有子类的公共(public)接口(interface)。对于不同的处理程序,“处理”的逻辑当然是完全不同的。所以我需要做的是将任何值传递给handle方法。然后特定的类可以将“任何东西”转换为他们期望的类型。基本上我需要的是类似java类Object的东西:D我尝试的第一件事是void*,但显然你不能做B*someB=dynamic_cast(theVoidPointer),所以没有运气。我

c++ - 将函数的名称发送给函数

我想做的是:classA{public:doublesum(doublea,doubleb);doublemax(doublea,doubleb);}templateclassB{std::vectordata;public:doublesum(doublea,doubleb);doublemax(doublea,doubleb);doubleaverage(MyFunction,doublea,dobuleb){doublesum=0;intn=data.size();for(inti=0;i例子:doubleaverage(max,doublea,doubleb){doublesu

c++ - 指针运算和积分提升

在表达式p+a中,其中p是一个指针类型,a是一个整数,整数提升规则是否适用?例如,如果a是一个char,在64位机器上它肯定会在添加到指针值之前扩展到64位(在编译的程序集中),但它是由标准指定的吗?会提升到什么地步?int、intptr_t还是ptrdiff_t?unsignedchar或size_t会被转换成什么? 最佳答案 因为char是一个整数类型,标准似乎不需要任何提升:对于加法,两个操作数都应具有算术或无作用域枚举类型,或一个操作数应是指向完全定义的对象类型的指针,而另一个应具有整数或无范围枚举类型似乎实现可能取决于底层

c++ - dladdr : pointer-to-function vs pointer-to-object

希望这是一个相当简单的C++问题(而不是语言律师问题)。如何在C++中使用GNU扩展dladdr?通常人们会用C编写以下内容:#ifndef_GNU_SOURCE#define_GNU_SOURCE#endif#includestaticvoidwhere_am_i(){}intmain(){Dl_infoinfo;dladdr((void*)&where_am_i,&info);return0;}但是使用clang可以看到转换可能无效:$clang--versionDebianclangversion3.6.2-3(tags/RELEASE_362/final)(basedonLLV

c++ - 实现对象列表时如何处理动态分配?

我必须实现一个如下所示的函数:MyList*sum(MyList*l1,MyList*l2){MyList*newlist=newMyList();//Addstwoobjectsandplacetheresultinathirdnewlistreturnnewlist;}该函数采用两个列表并将每个对象的总和放入一个新列表中。MyList类的节点带有指向next变量的指针,列表中的对象是用户定义的。这让我开始思考-我应该如何处理对象和列表本身的动态内存分配?因为我必须为新列表的每个对象创建内存。有没有什么办法可以把对象的总和值放在新列表中而不依赖于动态分配?也许通过做这样的事情:Obj