使用指针交换两个变量
Swapping two variable using 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;
}
我哪里错了?
代码不起作用,因为您没有在赋值时解引用指针。应该是
*((int*)p2)=*((int*)p1);
*((int*)p1)=temp;
请注意,您假设void*
指向int
,显然情况并非总是如此。从本质上讲,您不妨将void*
替换为int*
,并摆脱强制转换。
void swap(void *p1,void *p2, size_t sz)
在内部,API应该分配一个大小为sz
的缓冲区,将memcpy
放入其中,然后使用memcpy
进行交换。
在函数体中,您正在交换p1
和p2
的值;你不会想这么做的。您想要交换p1
和p2
指向的值:
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;
}
使用内存函数
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
您正在修改指针的副本,而不是其内容。你应该做这样的事情(只是向你展示这个想法,如果没有强制转换,这将无法工作,并且它仍然不是一个好主意):
temp = *p2
*p2 = *p1;
*p1 = temp;
如果你想交换你的指针,你将需要指针对指针:
void swap(void** ptr1, void** ptr2);
或对指针的引用:
void swap(void*& ptr1, void*& ptr2);
或者因为你显然在使用c++,你可以使用引用和模板来交换任何类型的数据。但是你确定你理解了所有的语言基础吗?
好运试试这个:
#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*
s,它也将是正确的(并且更具可读性)。
注[2]:因为你是用c++编程,你可以使用指针引用来代替。
尝试下面的代码:
#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;
}
在驱动函数中交换p1和p2的内容代码不起作用。这可能是因为您试图交换内存地址的起始位置,而操作系统限制了这一点。??然而,记忆功能完成了这项工作。
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 命令行参数,cant 或两个变量
- 在 for 循环中更新两个变量时遇到问题C++
- C++ 编译时在两个变量之间交替
- C++ 如何在包含两个变量的结构中存储与变量不同数量的值?
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 是否可以在C++中使用宏交换两个变量的出现?
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 正确证明C 中的两个变量合理(我想将它们视为一个变量)
- 可视C 编译器将相同的存储位置提供给两个变量
- 尝试使用 {} 和 std::make_pair() 交换两个变量时的行为不同
- 在rootframework中的根文件中编写两个变量
- 最短路径,带有两个变量
- 加入两个变量和LCD打印
- 在循环中声明两个变量以逆转字符串?在C 中
- 具有两个变量的"for"循环,一个变量每次迭代递增,每隔一次迭代递增
- 如何在C++中使用一个类中两个变量的值
- 仅在C 中的一个变量上,两个变量函数的数值集成(使用数值配方库)
- 如何在我存储的两个变量之间生成随机数