使用指针交换两个变量

时间:2012-12-20 15:40:22

标签: c++ void-pointers

我正在尝试使用指针(特别是一个void指针)按引用编写交换函数,但我的代码无效。这是我的代码:

void swap(void *p1,void *p2) 
{
    int temp;   
    temp=*((int*)p2);
    p2=p1; 
    p1=&temp;
}

int main() 
{
    int i=4;
    int j=5; 
    cout<<i<<j<<endl;
    swap(&i,&j); 
    cout<<i<<j<<endl;
    return 0;
}

我哪里错了?

7 个答案:

答案 0 :(得分:6)

代码不起作用,因为您没有取消引用分配指针。它应该是

*((int*)p2)=*((int*)p1);
*((int*)p1)=temp;

请注意,您假设void*指向int,这显然并非总是如此。基本上,你也可以用void*替换int*,并摆脱演员表。

API的更一般情况应如下所示:

void swap(void *p1,void *p2, size_t sz)

在内部,API应该分配一个大小为sz的缓冲区,对其进行memcpy,然后再次使用memcpy进行交换。

答案 1 :(得分:2)

在函数体中,您正在交换p1p2的值;你不想那样做。您想要将p1p2 指向的值交换:

void swap(int *p1, int *p2)
{
  int tmp = *p1;
  *p1 = *p2;
  *p2 = tmp;
}

我知道您想使用void *作为参数。别。您必须将它们转换为适当的目标类型才能执行分配:

int tmp = *(int *) p1;
*(int *) p1 = *(int *) p2;
*(int *) p2 = tmp;

呸。你不是通过制作参数void *来保存自己的东西。

由于您显然正在编写C ++,因此可以使用模板使该函数具有通用性:

template<typename T>
void swap(T *p1, T *p2)
{
  T tmp = *p1;
  *p1 = *p2;
  *p2 = tmp;
}

更好的是,使用模板和引用,所以你根本不处理指针:

template<typename T>
void swap(T &p1, T &p2)
{
  T tmp = p1;
  p1 = p2;
  p2 = tmp;
}

答案 2 :(得分:0)

您正在修改指针的副本,而不是其内容。 你应该做这样的事情(只是向你展示这个想法,如果没有强制转换,这将无法工作,而且它仍然不是一个好主意):

temp = *p2
*p2 = *p1;
*p1 = temp;

如果你想交换你的指针,你将需要指针指针:

void swap(void** ptr1, void** ptr2);

或对指针的引用:

void swap(void*& ptr1, void*& ptr2);

或者,因为您显然使用的是C ++,您可以使用引用和模板来交换任何类型的数据。但是你确定你理解了该语言的所有基础知识吗?

祝你好运

答案 3 :(得分:0)

使用记忆功能

void swap (void *vp1, void *vp2, const int size) {
char *buffer = (char *)malloc(sizeof(char)*size);
memcpy(buffer, vp1, size);
memcpy(vp1, vp2, size);
memcpy(vp2, buffer, size);
free(buffer);
}

int main()
{
int a = 10, b = 20;
printf("%d %d"a,b);
swap(&a, &b, sizeof(int));
printf("%d %d"a,b);

}

Output is:

10 , 20
20 , 10

如果我们不知道数据类型,那么我们使用void。

答案 4 :(得分:0)

试试这个:

#include <iostream>
using namespace std;

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

int main() {
  int a, b;
  cin >> a >> b;
  swap( &a, &b );
  cout << a << " " << b;
  return 0;
}

在取消引用指针a和b之前,必须先将它们转换为int*。之后,您只需执行交换。

注意:您无需将void*作为参数传递。如果你传递int*,它也是正确的(并且更具可读性)。

注意[2]:由于您使用C ++进行编程,因此可以使用而不是指针引用。

答案 5 :(得分:0)

尝试以下代码:

#include <iostream>
using namespace std;

void Swap(int **ptr1, int **ptr2){
    // Swapping the contents of p1 and p2 in the driver function
    int *temp;
    temp = *ptr1;                   
    *ptr1 = *ptr2;
    *ptr2 = temp;
    // Swapping the contents of x and y in the driver function
    int temp;
    temp = **ptr1;                  
    **ptr1 = **ptr2;
    **ptr2 = temp;
}

int main(){
    int x = 10, y = 15;
    int *p1 = nullptr;
    p1 = &x;
    int *p2 = nullptr;
    p2 = &y;
    cout << x << ' ' << y << endl;
    cout << *p1 << ' ' << *p2 << endl;
    Swap(&p1,&p2);
    cout << x << ' ' << y << endl;
    cout << *p1 << ' ' << *p2 << endl;
}

答案 6 :(得分:0)

在驱动程序功能中交换p1和p2的内容 代码不起作用。这可能是因为您试图交换内存地址的起始位置,而操作系统对此进行了限制。 ?? 内存功能可以完成这项工作。