草庐IT

Pointers

全部标签

c++ - 使用指针将 char* 转换为 unsigned char*

我正在编写一些使用fstreamread()函数的代码,该函数需要一个char*作为缓冲区。稍后,我想将此缓冲区中的字节作为无符号字符使用,因此我要么必须:1.将缓冲区声明为char*,然后稍后为每个元素执行static_casts,2.声明缓冲区作为unsignedchar*然后在我将它传递给读取函数时执行reinterpret_cast,或者3.将缓冲区声明为char*并创建一个转换指针,我将其用于将缓冲区作为unsignedchar进行访问。这是一个片段:char*buf=newchar[512];unsignedchar*ubuf=reinterpret_cast(buf);f

c++ - C++ 标准中哪里说::delete 可以更改左值?

我遇到了我的第一个编译器,它更改了传递给::delete的左值,但没有将左值清零。以下是正确的:Foo*p=newFoo();Foo*q=p;assert(p!=0);assert(p==q);::deletep;assert(p!=q);assert(p!=0);请注意,删除操作后p不为零,它已从旧值改变。一位同事告诉我,根据他使用一些大型机C++编译器将p更改为0xFFFFFFFF以及将p更改为0的其他编译器的经验,这并不罕见。在C++标准中哪里说允许编译器这样做?通过StackOverflow搜索,我发现了这个问题:Whydoesn’tdeletesetthepointertoN

c++ - 为什么在 C++ 中有这么多不同的方法来使用 new 运算符

我刚刚阅读了newoperatorexplanationonthecplusplus.com.该页面给出了一个示例来演示使用new运算符的四种不同方式,如下所示://operatornewexample#include#includeusingnamespacestd;structmyclass{myclass(){cout我的问题是:使用的最佳做法是什么新运营商?myclass*p3=newmyclass是否等同于myclass*p3=newmyclass()? 最佳答案 因为他们的目的不同。如果您不希望new在失败时抛出std:

C++,缓存局部性改进的基准测试方法?

我有一个X类的实现,它有两个指向两条信息的指针。我已经编写了一个新的实现,类Y,它只有一个指向结构的指针,该结构将两条信息一起作为相邻成员包含在内。X和Y的方法通常只需要操作其中一条信息,但提供了一个返回指向第二条信息的指针的get()方法(在这种情况下,X类只返回指向那条信息的指针,Y类返回地址结构的第二个成员)。在正常使用中,对X和Y的方法的调用将穿插在对get()的调用中,并对返回的第二部分进行处理。我希望在现实生活中应该有性能改进,因为这两条信息在Y类实现中的内存中彼此相邻(因为它们是结构的相邻成员),但我'我没有发现我编写的基准测试有任何差异(穿插调用X和Y的方法,并在大循环

c++ - C++ 中的双向链表

我有一个作业要求我们实现一个双向链表类。出于某种原因,他们将节点struct定义如下:structnode{node*next;node*prev;T*o;};在我看来,如果结构成员“数据”不是指针,那么编写类会容易得多。不用说我不能改变它,所以我将不得不解决它。我尝试实现将元素添加到列表开头的方法,如下所示:templatevoidDlist::insertFront(T*o){node*np=newnode;Tval=*o;np->o=&val;np->prev=NULL;np->next=first;if(!isEmpty()){first->prev=np;}else{last

c++ - 数组索引和地址返回相同的值

#includeintmain(void){inta[3]={1,2,3};printf("\n\t%u%u%u\t\n",a,&a,&a+1);return0;}现在我不明白为什么a和&a返回相同的值,它背后的推理和实际应用是什么?另外&a的类型是什么,我也可以做&(&a)吗? 最佳答案 Nowidon'tgetwhyaand&areturnthesamevalue,whatisthereasoninga是数组的名称,它衰减到指向数组第一个元素的指针。&a只是数组本身的地址,尽管a和&a打印相同的值,但它们的类型不同。Alsowh

c++ - 将_cast 重新解释为 void 是否合法*

我在看https://en.cppreference.com/w/cpp/language/reinterpret_cast我注意到它指定了我们始终可以转换为的合法类型:字节*char*unsignedchar*但是我没有在列表中看到void*。这是疏忽吗?我的用例需要reinterpret_cast,因为我正在从int**转换为void*。我最终将从void*转换回int**。 最佳答案 这些类型不受严格的别名规则约束。这并不意味着它们是您可以与reinterpret_cast一起使用的唯一类型.在将对象指针转换为另一种对象指针类

c++ - 具有 0 个元素的数组

0个元素的数组等同于未分配的指针吗?intarr[0];和int*arr;一样吗?编辑:如果我做了类似的事情会怎样:intx[0];int*constarr=x;我试过这段代码并编译成功。据我所知,x和arr应该指向内存中的相同位置。在这种情况下会有什么不同? 最佳答案 完全没有。对于arr[0],arr有一个明确定义的地址。在*arr的情况下,arr只是未初始化。在您的EDIT之后,在这里您使用之前定义的数组初始化constarr:变量的内容没有区别,但是您将被允许对它们执行的操作。

c++ - 如何在 UML 类图中描述指向类的指针?

如果我有一个classA,它包含一个指向classB的指针,以及一个接收指向classB指针的输入的方法classA{private:B*attribute;public:voidmethod(B*par);}如何在UML类图中描述它?我必须使用*吗?是什么样的构成? 最佳答案 在UML中,显示它是否是指针并不重要。为什么?因为,您可能正在使用UML来描述没有指针的语言的OOD。快速回答:根据您的代码,A聚合了B(A类中的空菱形,用实线连接B)。这是因为没有删除A.attribute指针引用的析构函数。真正重要的是说出被引用对象的生

c++ - 在 C 下通过引用传递指针参数?

#include#includevoidgetstr(char*&retstr){char*tmp=(char*)malloc(25);strcpy(tmp,"hello,world");retstr=tmp;}intmain(void){char*retstr;getstr(retstr);printf("%s\n",retstr);return0;}gcc不会编译此文件,但在添加#include之后我可以使用g++来编译这个源文件。问题是:C编程语言是否支持通过引用传递指针参数?如果不是,为什么?谢谢。 最佳答案 不,C不支持引