c# 在C中使用指针交换两个变量值不起作用

ylamdve6  于 2023-08-01  发布在  C#
关注(0)|答案(2)|浏览(243)

我在尝试使用执行两种不同方法的函数交换两个变量的值时遇到了问题。

第一种方法如下所示:

void interchange_values(int *first_number_pointer, int *second_number_pointer) {
   
    int temporal_variable;

    temporal_variable = *first_number_pointer;
    *first_number_pointer = *second_number_pointer;
    *second_number_pointer = temporal_variable;

};

字符串
这和预期的一样。
但是第二种方法不交换两个变量的值。

void interchange_values(int *first_number_pointer, int *second_number_pointer) {
     
    int *temporal_ptr = first_number_pointer;
    first_number_pointer = second_number_pointer;
    second_number_pointer = temporal_ptr;
};


有人能解释一下为什么在第二种方法中,我没有交换原始变量的值吗?

t9eec4r0

t9eec4r01#

对于第二种方法,您需要将指针传递给指向整数的指针。您还需要定义指向整型变量的指针(因为您将交换引用,并且您需要保存引用的对象)它不会交换整数的值。
要修改传递给函数的对象,需要传递对它的引用(指针)。

void interchange_values(int **first_number_pointer, int **second_number_pointer) {
   
    int *temporal_variable;

    temporal_variable = *first_number_pointer;
    *first_number_pointer = *second_number_pointer;
    *second_number_pointer = temporal_variable;

};
int main(void)
{
    int a = 5; int b = 10;
    int *pa = &a; int *pb = &b;

    printf("Before: a = %d b = %d\n", a , b);
    printf("Before: *pa = %d *pb = %d\n", *pa , *pb);
    interchange_values(&pa, &pb);
    printf("After:a = %d b = %d\n", a , b);
    printf("After: *pa = %d *pb = %d\n", *pa , *pb);
}

字符串
结果:

Before: a = 5 b = 10
Before: *pa = 5 *pb = 10
After:a = 5 b = 10
After: *pa = 10 *pb = 5


https://godbolt.org/z/vfrfzK1r9

31moq8wy

31moq8wy2#

在第一个示例中,您通过引用(通过指针)传递所需更改的变量。
指针本身是通过值传递的,正如其他人所提到的,这意味着它们的作用域是该函数的局部。
这就是为什么在C标准库中,当不仅需要潜在地更改基本数据,而且需要潜在地更改指针本身时,您会看到接受指针指针的函数。这种函数的一个例子是search.h中包含的树的根。任何可以重新分配内存并物理地重新定位内存中的根的函数都接受指针指针,因为您通过引用传递指针。tsearch可能需要移动根,因此它通过引用接受指针,而twalk永远不会修改根,因此它通过值接受指针。Link to man page for the described tree functions

编辑:简单示例

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

void interchange_pointers_by_reference(int ** first, int ** second)
{
    int * tmp_ptr = *first;
    *first = *second;
    *second = tmp_ptr;
}

int main()
{
    int * foo = malloc(sizeof(*foo));
    int * bar = malloc(sizeof(*bar));
    *foo = 1;
    *bar = 2;
    printf("foo = %d, bar = %d\n", *foo, *bar);
    printf("running function\n");
    interchange_pointers_by_reference(&foo, &bar);
    printf("foo = %d, bar = %d\n", *foo, *bar);
    return 0;
}

个字符

相关问题