如何使用指针交换2个整数?

时间:2016-01-17 18:50:49

标签: c

当我尝试使用指针交换这两个整数时,我得到了分段错误。

基本上在我交换之前,x已分配给1y已分配给2。交换后x已分配给2y已分配给1

该程序采用两个整数xy,据说可以交换它们:

int swap(int x, int y){

    int *swapXtoY;
    int *swapYtoX;

    *swapXtoY = y;
    *swapYtoX = x;
}

4 个答案:

答案 0 :(得分:7)

函数swap期望它的两个参数都为int,但您传递的是int *。编译器应该对此提出警告。

似乎你不知道指针在C中是如何工作的。你的函数只是将两个int分配给局部变量。功能应该是:

int swap(int *x, int *y){

    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

答案 1 :(得分:5)

swap方法应该接受两个指针,而不是两个整数 试试以下。

int swap(int* x, int* y){
  int temp = *x;
  *x = *y;
  *y = temp;    
}

答案 2 :(得分:1)

你必须按地址将变量传递给函数来改变它们的值。也就是说,你的函数也应该指向指针。这是一个可以交换任何C数据类型的变量的泛型函数:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void Swap(void *x,void *y,size_t bytes);

int main(void)
{
    int x = 3, y = 4;
    Swap(&x,&y,sizeof(int));
    printf("x now : %d\n",x);
    printf("y now : %d\n",y);
    return 0;
}
void Swap(void *x,void *y,size_t bytes)
{
    void *tmp = malloc(bytes);
    memcpy(tmp,x,bytes);
    memcpy(x,y,bytes);
    memcpy(y,tmp,bytes);
    free(tmp);
}

答案 3 :(得分:0)

首先,你的函数通过值 1 传递它的参数,这使得函数不可能对它们进行任何持久的更改。

其次,交换习语包括:

  • 定义一个中间变量temp,它初始化为两个变量之一,例如x

  • 将第二个变量y的值分配给第一个(保存在temp变量x (现在{ {1}}的值为tempx的值为x

  • 最后,将y分配给第二个变量temp (现在y的值为x,反之亦然)

在C代码中,这看起来像:

y

然后调用函数:

void swap (int *x, int *y ) {

    // dereference x to get its value and assign it to temp
    int temp = *x; 

    // dereference x and assign to it the value of y
    *x = *y;

    // complete the swap
    *y = temp;
}

您可能想要检查dereference operator *address-of operator &

的含义

1。按值:它传递传递的变量的副本,这可以防止在函数外部进行任何更改。