草庐IT

Pointers

全部标签

转换为整数时的 C++ 短数组 'reversed'

作为C++的新手,我一直在研究指针。我编写了以下代码来将短数组解释为整数:#includeintmain(){shortarray[2]={10,9};short*pointer=array;std::cout为什么整数的值是589'834(0009000A)而不是655'369(000A0009)?从打印的指针地址来看,数组在内存中是有序的,为什么转换为整数会改变这种情况? 最佳答案 此行为未定义:int*pointer2=(int*)array;仅当T2的对齐要求相同或不那么严格时,才允许将指向T1的指针重新解释为指向T2的指针

c++ - 子类指针如何严格等于父类指针?

我在两种智能指针之间编写了一个运算符==,我想我应该运行一个快速的健全性检查。我对结果感到惊讶...在下面的代码片段中,为什么f和b的所有变体最终都具有相同的值?structFoo{intx;};structBar:publicFoo{inty;};#includeintmain(){Barbar;Foo*f=&bar;Bar*b=&bar;std::cout(f);intbi=reinterpret_cast(b);std::cout 最佳答案 关于基类对象与其子类对象的地址不同的唯一情况是涉及多重继承。在上面的例子中,内存大概是

c++ - 如何从 char* 转换为 T*?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:C++Whenshouldweprefertouseatwochainedstatic_castoverreinterpret_cast哪个更好?static_cast(static_cast(buffer));或reinterpret_cast(buffer);其中buffer是char*(包含T类型值的内存块)。

c++ - 指针向下转换和向上转换的用法区别?

我想知道当我们使用向下转换和向上转换时,指针转换到底发生了什么。我有两个问题。其中前2个是评论。Q3终于结束了。#includeusingnamespacestd;classA{public:virtualvoidf(){coutf();pb->f();paUpcast->f();pbDowncast->f();return1;}问题3:我想总结一个规则来推断如果我们将虚函数和指针一起使用会发生什么,但我就是想不通。本来我以为虚函数会把我们带到指针真正指向的地方。因此,当我们输入A*paUpcast=newB();paUpcast->f();如果A.f()是虚函数,第二行会显示“B”,

c++ - 如何阅读 C++ 指针构造?

这是一个新手C++问题。以下两种构造之间有什么区别?1.constint*const*constx2.constint**我如何阅读这些结构? 最佳答案 HowdoIreadtheseconstructs?向后阅读它们并将*阅读为“指针”。constint*const*const是一个常量指针,指向一个整型常量的常量指针。constint**是指向整型常量指针的指针。 关于c++-如何阅读C++指针构造?,我们在StackOverflow上找到一个类似的问题:

c++ - 更好地解释 C++ 指针函数?

我正在为我的C++作业解决一个涉及指针的问题。我不要求任何人做我的工作,而只是帮助理解问题。问题是写一个函数voidsort2(double*p,double*p)//FirstoffIamassumingthesecond"p"isatypoandshouldbeaq此函数将接收两个指针并对它们指向的值进行排序。例如,如果您调用sort2(&x,&y),则在调用后x我想知道的是,如果指针已经被函数取消引用,我是否只是比较x和y而不是它们的内存地址?如果不是,我该如何比较内存地址? 最佳答案 您正在传递2xdouble变量的地址,以

c++ - 类实例和指针背后的 Delphi 设计原则是什么?

我有C++背景,对类、指针和内存地址相当了解。但是,对于Delphi,我发现自己很困惑。我知道,当您在函数/过程的var部分中声明特定类型类的变量时,您真正声明的是指向该类的指针。例如,下面的Delphi和C++大致相同,都在堆上分配MyObject类所需的内存量。//DelphiprocedureBlah.Something();varo:MyObject;begino:=MyObject.Create;o.Free;end;//C++voidBlah::Something(){MyObject*o=newMyObject();deleteo;}在C++中,使用指针(和引用)允许在类

c++ - 为什么 observer_ptr 在 move 后不归零?

为什么不是observer_ptrmove操作后归零?它在默认构造中被正确设置为nullptr,这确实有意义(并防止指向垃圾)。相应地,当std::move()开始时,它应该被清零,就像std::string、std::vector等这将使它成为多个上下文中的一个很好的候选者,在这些上下文中,原始指针是有意义的,并且自动在具有原始指针数据成员的类上生成move操作,例如thiscase.编辑正如@JonathanWakely在评论中指出的(与aforementionedquestion相关):ifobserver_ptrwasnullafteramoveitcanbeusedtoimp

c++ - "*(pointer + integer)"在 C++ 中有什么作用?

我对这个程序中一行代码的作用感到困惑:int*temp=newint[cap];intnum=0;for(inti=name;iname、number和foo是全局变量(foo是指针),cap是一个参数。具体来说,我不明白这一行:*(temp+count)=*(foo+i);为什么会有指向括号的指针,这有什么作用? 最佳答案 *(temp+count)=*(foo+i);+运算符执行指针运算。将一个整数添加到一个指针值会产生一个新指针,该指针在原始指针之后递增了指定数量的对象。例如,如果p是指向arr[0]的指针,则p+2指向arr

c++ - 我怎么知道我是否需要删除 C++ 中的某些内容?

想象一下下面的类:classMyString{public:constchar*str;std::size_tstr_len;MyString(constchar*str,std::size_tstr_len):str{str},str_len{str_len}{}}我对为MyString实现析构函数有点困惑。我的第一个想法是它看起来像这样:~MyString(){delete[]str;}但是如果我不能确定它被分配了,我怎么能删除它呢?例如,我可以像这样创建MyString的实例:constchar*c_string="Hello,World!";MyStringmy_string(