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

4
当我尝试使用指针交换这两个整数时,出现了段错误。
在交换之前,x 被赋值为 1y 被赋值为 2。交换后,x 被赋值为 2y 被赋值为 1
该程序接受两个整数 xy,旨在交换它们。
int swap(int x, int y){

    int *swapXtoY;
    int *swapYtoX;

    *swapXtoY = y;
    *swapYtoX = x;
}

int swap(int x, int y) 方法接受两个整数,而不是两个指针。请尝试使用以下方法 int swap(int* x, int* y) - tchelidze
"*swapXtoY = y;" 使用了一个未初始化的指针,这种未定义行为会导致通过将 "y" 写入有害位置或超出允许的内存分配而引起段错误。 - Weather Vane
请注意,您缺少了return;。 - Claudio Cortese
4个回答

8

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

看起来你并不知道C语言中指针的工作原理。你的函数只是将两个int分配给本地变量。函数应该像这样:

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

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

5

swap方法应该接受两个指针,而不是两个整数。
请尝试如下操作。

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

1
int * temp --> int temp - Weather Vane

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);
}

0

首先,您的函数通过值传递其参数1,这使得函数无法对它们进行任何持久性更改。

其次,交换惯用语由以下组成:

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

  • 将第二个变量y的值分配给第一个(保存在temp中)变量x(现在temp具有值xx具有值y

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

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

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;
}

然后调用该函数:

// if the variables are not pointers
swap(&x, &y);

// if variables are passed via pointers
swap(x_ptr, y_ptr);

你可能想要查看解引用运算符*取地址运算符&的含义。


1. 按值传递:它传递了传递变量的副本,防止函数外部的任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接