有没有一种方法可以不使用指针来定义循环引用?我需要这样的东西:structA;structB{Aa;};structA{Bb;};谢谢! 最佳答案 您可以改用引用structA;structB{A&a;};structA{Bb;};但是不,如果没有某种程度的间接寻址,就不可能创建循环引用。您的示例所做的甚至不是创建循环引用,而是试图创建递归定义。结果将是一个无限大的结构,因此是不合法的。 关于c++-C++中没有指针的循环引用,我们在StackOverflow上找到一个类似的问题:
我想知道,你能在一个数组中创建一个指向一组变量的指针吗?像这样array[20]{'a','b','c',...}pointer=array[6through10];那么你可以说...*pointer[0]==array[6];和*pointer[5]==array[10];和*指针的长度5==sizeof(*pointer)\sizeof(type);确定让我解释一下我想要完成的事情,也许这会让我清醒一点。我想将整个文件读入缓冲区,但我想逐个读取。将一个小数组传递给read()然后将其循环到更大的数组中达不到目的。我希望我可以直接“指向”我想要填充的缓冲区中的一个区域,并将其传递给r
在C++中是否可以使用指向不同类型的指针数组?请举个例子) 最佳答案 通常,如果您想拥有不同“类型”的指针的集合,您可以通过从基类/接口(interface)派生并存储指向该基类的指针的方式来实现它。然后通过多态性,您可以让它们表现为不同的类型。classBase{public:virtualvoiddoSomething()=0;};classA:publicBase{voiddoSomething(){coutpointers;pointers.push_back(newA);pointers.push_back(newB);
当我连续多次编译和执行这段代码时,它报告cc的地址为0x0012FF5C。但是当我尝试使用foo中对printf的第二次调用打印出该地址处的字符串时,它打印出垃圾而不是打印出“Hello”?为什么这样??当我知道地址位于应用程序的地址空间内时(至少直到我不重新启动我的PC,或启动其他需要大量空间的应用程序,这会导致我的申请被调出)??voidfoo(char*cc[]){printf("%x\n",cc);printf("%s\n",(char*)(0x0012FF5C));}intmain(){char*c[]={"Hello","World"};foo(c);}
在C和C++中,以下声明的作用是什么?constint*i;int*consti;constvolatileintip;constint*i;以上声明是否有误?如果不是,它们之间的含义和区别是什么?上述声明的有用用途是什么(我的意思是在什么情况下我们必须在C/C++/嵌入式C中使用它们)? 最佳答案 constint*i;i是指向常量整数的指针。i可以更改为指向不同的值,但不能更改i指向的值。int*consti;i是指向非常量整数的常量指针。i指向的值可以更改,但不能更改i以指向不同的值。constvolatileintip;这个
我需要将指针表示为用户的字符串。有时这些值可能会保存到一个文件并传输到具有不同体系结构的计算机(32位与64位是当前的主要问题)并从文本文件加载以进行比较-我只会比较加载的值彼此,但我仍然更喜欢比较数字而不是字符串。我目前正在使用:SomeClass*p;...printf("%ld",(uintptr_t)p);但我想知道这是否是可移植的(虽然Windows和Linux仅在现阶段很重要),以及一旦出现128位系统这是否会中断?编辑:除非我决定使用uint64_t,并确定64位是屋顶,否则无法完成此操作,因为某些64位指针可能在32位整数范围之外。因此,我决定比较字符串会更安全,即使它
#defineSAFE_DELETE(a)if((a)!=NULL)delete(a);(a)=NULL;或templatevoidsafe_delete(T*&a){deletea;a=NULL;}或者其他更好的方式 最佳答案 我不会说两者都不是,因为两者都会给您一种虚假的安全感。例如,假设您有一个函数:voidFunc(SomePtr*p){//stuffSafeDelete(p);}您将p设置为NULL,但函数外的p拷贝不受影响。但是,如果您必须这样做,请使用模板-宏总是有可能影响其他名称。
我知道指针用于指向对象,因此您必须在程序中使用相同的指针。但是指针名称是如何存储的。声明一个比它指向的对象占用更多资源的指针名称是否有点矫枉过正,例如:intintOne=0;int*this_pointer_is_pointing_towards_intOne=&intOne;我知道这是一个荒谬的例子,但我只是想把这个想法说清楚。编辑:指针的名称必须存储在比指向对象的地址占用更多字节的地方。 最佳答案 变量名的长度对程序的大小没有任何影响,只会影响编写程序所需的时间。 关于C++指针名
我有一些代码使用了很多指向同一个地址的指针。给出一个等效的简单示例:int*p=newint(1);int*q=p;int*r=q;deleter;r=NULL;//ok//deleteq;q=NULL;//NOTok//deletep;p=NULL;//NOTok如何在不多次删除的情况下安全地删除它?如果我有很多指针都指向同一地址的对象,这尤其困难。 最佳答案 您的工具是boost库的shared_ptr。查看文档:http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/shared
我知道这听起来像是一个愚蠢的问题,但为什么我会收到类似“cannotconvertObject*toObject"当我尝试使用语句"实例化一个新对象时Objectobj=newObject();“?我是否理解“new”关键字是为指针保留的?还是其他原因? 最佳答案 Object*obj=newObject();new始终返回指向对象的指针。如果您只写Objectobj,这意味着obj将保存对象本身。如果它在函数内部以这种方式声明,那么内存将在堆栈上分配,并在您离开该函数后被删除。new在堆上分配内存,因此可以从函数返回指针。请注意,