Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针交换_C_Pointers - Fatal编程技术网

C 使用指针交换

C 使用指针交换,c,pointers,C,Pointers,在下面的代码中,为了在px和py之间进行交换,您需要一个指针来指向py和px的地址,以便有效地交换它们 我的问题是,当px的值被放入int-temp时,它如何返回正确的值,因为没有指向它的指针能够给出正确的值,以及int-temp的地址如何不克隆以给出错误的值 void swap(int px, int py) { int temp; temp = px; px = py; py = temp; } //pointer version void swap(in

在下面的代码中,为了在px和py之间进行交换,您需要一个指针来指向py和px的地址,以便有效地交换它们

我的问题是,当px的值被放入int-temp时,它如何返回正确的值,因为没有指向它的指针能够给出正确的值,以及int-temp的地址如何不克隆以给出错误的值

void swap(int px, int py)
{
    int temp;
    temp = px;
    px = py;
    py = temp;
}

//pointer version

void swap(int *px, int *py)
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}
在这个函数中

void swap(int *px, int *py)
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}
有px和py指向的交换值。函数本身不交换指针

要交换指针指向的值,您需要一个中间内存,临时存储px指向的值,该值将被py指向的值覆盖

因此,该函数使用临时存储值*px的局部变量temp

请注意本作业说明中的内容

temp = *px;
变量temp存储px指向的值,即具有int类型的*px。分配给temp的不是指针px本身。

两个函数都交换int值。但是这种交换会影响调用代码的整数吗

对于第二次交换,交换的效果可以在原始a,b中看到,因为该函数与原始a,b的地址一起工作

对于第一次交换,交换的效果在原始c、d中看不到。由于交换功能是交换c、d的副本。净效果:第一个交换函数只是浪费时间。它不交换c,d


有两件事你需要知道

1在C中调用函数时,参数总是按值传递。如果在函数内部对保存传递值的变量进行更改,则在函数返回时更改将丢失。换句话说,在函数内部所做的任何更改都不能在函数外部看到

2使用指针时,指针前面的*运算符表示指针指向的位置。这称为取消对指针的引用。所以如果你这样做,px=5;您不会更改任何指针值!更改指针指向的位置处的值

仔细查看您的代码:

在第一个示例中,您有如下内容:

void swap(int px, int py)
{
    int temp;
    temp = px;
    px = py;
    py = temp;
}

int main(void)
{
    int x = 10;
    int y = 100;
    swap(x, y);
    printf("%d %d\n", x, y);
    return 0;
 }
在C语言中,一切都是通过值传递的。因此,当调用swap时,传递给函数的是值10和100。它不是变量x和y。换句话说,函数中的-px和py与main中的变量x和y无关。这意味着,当函数返回且x和y不变时,对变量px和py所做的任何更改都将丢失

您的第二个示例如下所示:

void swap(int px, int py)
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}

int main(void)
{
    int x = 10;
    int y = 100;
    swap(&x, &y);  // Notice the & operator
    printf("%d %d\n", x, y);
    return 0;
 }
像往常一样,我们有传递价值。但在本例中,传递的值是指向int的两个指针的值。更具体地说,传递x和y的地址

就像前面一样,您不能像第一个示例那样更改传递给函数的值,但是您可以更改指针指向的任何对象的值

这里您需要知道,在指针前面*可以访问指针指向的任何对象

因此,执行temp=*px将读取px指向的值。在本例中,它是10,因此temp得到值10

Doing*px=*py读取py指向即100的值,并将其放置在px指向即main中的x现在为100的位置

Doing*py=temp读取temp保持的值,即10,并将其放置在py点,即main中的y现在为10的位置

因此,当函数返回时,x和y的值已交换


注意,代码从不使用指向临时地址的指针。变量temp仅用作普通整数。

当px的值完全不清楚您的要求时。您不能只传递值而期望它们更改原始值。请提供一个链接,然后查看!如果你问第二个版本是如何工作的,它是一个int,而不是两个参数那样的指针,那是因为它交换了它们指向的值,奥拉夫的第一个函数给出了错误的答案,因为指针指向一个地址,所以结果不是预期的,但是在第二个版本中,也没有指针指向int MtP,所以为什么给出期望值而不改变被放入其中的值?你的问题由两个答案中的一个来回答?如果是,请接受相关答案。
void swap(int px, int py)
{
    int temp;
    temp = px;
    px = py;
    py = temp;
}

int main(void)
{
    int x = 10;
    int y = 100;
    swap(x, y);
    printf("%d %d\n", x, y);
    return 0;
 }
void swap(int px, int py)
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}

int main(void)
{
    int x = 10;
    int y = 100;
    swap(&x, &y);  // Notice the & operator
    printf("%d %d\n", x, y);
    return 0;
 }