Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
交换空隙* C++中的指针_C++_Swap_Void_Void Pointers - Fatal编程技术网

交换空隙* C++中的指针

交换空隙* C++中的指针,c++,swap,void,void-pointers,C++,Swap,Void,Void Pointers,我想问这种交换实现是否有效: void swap (void* &a, void* &b ) { void * tmp = a; a=b; b=tmp; } int main() { void * a; void * b; swap (a,b); return 0; } 我是否需要将对象的大小发送到swap方法并使用它?如果是这样,那么这个函数的好实现是什么呢?它可以工作。我不确定它是否像您认为的那

我想问这种交换实现是否有效:

 void swap (void* &a, void* &b ) 
 {    
     void * tmp = a;
     a=b;
     b=tmp;
 }

int main() 
{
   void * a;
   void * b;   
   swap (a,b);
   return 0;
}

我是否需要将对象的大小发送到swap方法并使用它?如果是这样,那么这个函数的好实现是什么呢?

它可以工作。我不确定它是否像您认为的那样:指针值是交换的,而不是它们指向的任何对象。

它可以工作。我不确定它是否做了您认为它做的事情:指针值被交换,而不是它们指向的任何对象。

这个函数对于交换无效指针来说效果很好;编译器知道它们的大小。如果您想交换除void指针以外的其他对象,则需要一个不同的函数

编辑:但这是交换模板函数的常规模式:

template <class Ty>
void swap(Ty& lhs, Ty& rhs) {
    Ty tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

这个函数可以很好地交换void指针;编译器知道它们的大小。如果您想交换除void指针以外的其他对象,则需要一个不同的函数

编辑:但这是交换模板函数的常规模式:

template <class Ty>
void swap(Ty& lhs, Ty& rhs) {
    Ty tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

在我看来,指针只是一个指针,所以它指向的东西的大小并不重要,但为什么不直接使用它呢


在本例中,您正在处理未初始化的变量,这很糟糕,但这似乎不是您问题的重点。

在我看来,指针只是一个指针,所以它指向的对象的大小无关紧要,但为什么不直接使用呢


在本例中,您正在处理未初始化的变量,这很糟糕,但这似乎不是问题的重点。

您已将大小发送到swap方法。你说,这里有两个空指针,请交换它们。大小为sizeofvoid*。您已将大小发送到交换方法。你说,这里有两个空指针,请交换它们。尺寸是sizeofvoid*。你是什么意思?a现在不会指向b所指向的,反之亦然吗?或者你的意思是他们没有改变实际值,只是改变了他们的地址;a=新int42;b=新int17;swapa,b;,现在a将指向最初分配给b的内存,b将指向最初分配给a的内存。换句话说,值42和17保持不变。这取决于您实际想要实现的目标,无论这是否是您想要的。我的意思是,在以下代码中:f{some_type x,y;void*a=&x,*b=&y;swap a,b;}对象x和y不会改变,也不会被交换。但是现在a将指向y,b指向x,你是什么意思?a现在不会指向b所指向的,反之亦然吗?或者你的意思是他们没有改变实际值,只是改变了他们的地址;a=新int42;b=新int17;swapa,b;,现在a将指向最初分配给b的内存,b将指向最初分配给a的内存。换句话说,值42和17保持不变。这取决于您实际想要实现的目标,无论这是否是您想要的。我的意思是,在以下代码中:f{some_type x,y;void*a=&x,*b=&y;swap a,b;}对象x和y不会改变,也不会被交换。但现在a将指向y,b指向x。