通过指针交换值

时间:2016-03-16 05:38:12

标签: c

我觉得这可能不是最好的主意,但我已经在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);

4 个答案:

答案 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;

使用papb调用“交换”后,ab仍然包含35,{{ 1}}指向pa5指向pb,但3仍指向qa3指向qb

另请注意,如果没有两个正确初始化的指针变量,您只需无法调用您的交换。

答案 3 :(得分:0)

int varA = 5, varB = 10;
int *pA = &varA;
int *pB = &varB;
swap((void**)&pA, (void**)&pA);

现在pA指向varBpB指向varA