我觉得这可能不是最好的主意,但我已经在C中实现了一个通用交换功能:
void swap(void** p1, void** p2) {
void* temp = *p1;
*p1 = *p2;
*p2 = temp;
}
但是,我在调用此功能时遇到困难。 swap(&&a, &&b)
对于整数a和b不起作用'&&'是标签运算符,swap(&(&a), &(&b))
给出了作为一元'&'所需的错误'左值。操作数&#39 ;.我该如何调用此功能?
编辑:为清晰起见更改了变量名称
编辑:我尝试执行以下操作,但是,因为& a和& b似乎是只读的('左值作为分配的左操作数'),不起作用:
int a = 5;
int b = 3;
int* temp = &a;
&a = &b;
&b = temp;
assert(a == 3);
assert(b == 5);
答案 0 :(得分:6)
您不能使用swap(&(&l_limit), &(&u_limit))
,因为&l_limit
求值为临时右值指针,其地址无法获取。 &&u_limit
也存在同样的问题。
您需要使用:
void* ptr1 = &l_limit;
void* ptr2 = &u_limit;
swap(&ptr1, &ptr2);
答案 1 :(得分:3)
早上好指出,要获得真正的通用交换功能,您应该考虑使用memcpy
。它可以用作通用的分配。
您的swap
将如下所示:
void swap(void *a, void *b, size_t s)
{
void *tmp = malloc(s);
if (tmp)
{
memcpy(tmp, a, s);
memcpy(a, b, s);
memcpy(b, tmp, s);
}
free(tmp);
}
可以像这样使用:
#define MAX 256
int main()
{
// works for primitive types
int a = 4, b = 5;
swap( &a, &b, sizeof(int));
printf("%d %d\n", a , b);
// as well as for pointers
char cA[MAX] = "World!";
char cB[MAX] = "Hello ";
swap( &cA, &cB, MAX);
printf("%s%s\n", cA, cB);
}
这将安全地交换值而无需指针指针。
答案 2 :(得分:1)
你是对的:这可能不是最好的主意。
你没有交换两个数据,你正在交换值恰好指向它们的两个指针,但数据保持不变。
例如假设
int a= 3, b= 5;
int* pa= &a, * qa= &a, * pb= &b, * qb= &b;
使用pa
和pb
调用“交换”后,a
和b
仍然包含3
和5
,{{ 1}}指向pa
和5
指向pb
,但3
仍指向qa
和3
指向qb
。
另请注意,如果没有两个正确初始化的指针变量,您只需无法调用您的交换。
答案 3 :(得分:0)
int varA = 5, varB = 10;
int *pA = &varA;
int *pB = &varB;
swap((void**)&pA, (void**)&pA);
现在pA
指向varB
而pB
指向varA