为什么交换功能仅在使用指针时有效?

时间:2014-04-11 03:07:13

标签: c pointers

这是我的意思的一个例子。此示例不使用指针,变量不会交换。

void  swap(int x, int y);
main()
{
    int a = 33, b = 55;
    swap (a, b);
    printf("a = %d, b = %d\n", a, b);
}

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

现在如果你使用指针变量a和b swap。为什么它只适用于指针?

4 个答案:

答案 0 :(得分:3)

C是一种按值传递的语言。 始终。这意味着:

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

您正在交换从传递给该函数的获得的xy。当你这样调用时:

int main()
{
    int a = 33, b = 55;
    swap (a, b); // passing values of a and b
    printf("a = %d, b = %d\n", a, b);
}

ab已通过。所以这是你的问题。解决方案是使传递一些可用于修改调用者变量的东西。如果要修改这些变量,则需要以某种方式从被调用代码中可寻址。嗯...

这种机制被称为“通过地址传递”,虽然它听起来很奇特但事实并非如此。它只是一个按值传递的重组,但具有不同的值 type 。在我们传递类型int的值之前,我们将传递整数变量的地址,并将形式参数声明为指针int代替。不犯错误。它们仍然是,但不是基本的int类型。相反,传递的值是int变量的地址。要访问 at 这些地址指针,指针与取消引用运算符一起使用(其中有几种,此处只显示一种):

void swap(int *ptrToX, int *ptrToY)
{
    int temp = *ptrToX; // dereference right, store value in temp
    *ptrToX = *ptrToY;  // dereference both, assigning value from right to left.
    *ptrToY = temp;     // dereference left, assign temp value
}

并像这样调用:

int main()
{
    int a = 33, b = 55;
    swap (&a, &b); // passing addresses of a and b
    printf("a = %d, b = %d\n", a, b);
}

注意:作为传值的例外,通常被引用错误的是传递数组。虽然在新年前夜像“五彩纸屑”这样的短语“朽烂指针”,但我厌恶那种白话。动词本身意味着功能性操作,实际上 none

语言指定表达式中使用的数组的是其第一个元素的地址。换句话说,它的“值”已经是一个地址,因此可以简单地将 by-value 传递给期望指向相同基类型的指针的函数。因为它是一个地址,所以可以使用接收参数(一个指针,因为那是什么保存地址值)来修改来自调用者的数组内容。仅次于多个间接层(指针指针等),对于刚接触C的人来说,这是最困难的事情,但重要的是你这样做。

答案 1 :(得分:1)

当您致电swap时,会将变量ab的值传递给它。这些值通过副本传递。当您在swap中交换这些值时,您只会交换ab的本地副本。

当您将指向变量的指针传递给函数时,您可以修改调用函数中变量的值。

答案 2 :(得分:1)

这称为按值传递 您只是传递a&的值。 b功能的swap。交换函数该值复制到其变量x& ya& b。因此,在swap您正在处理x& y代替a& b

另一方面,当你传递指针时,你传递的地址是a&存储b。您的x& y指向同一地址,因此您正在操作a&存储b。因此,main可以看到更新的值。

答案 3 :(得分:0)

这是通过引用V / s调用值来定义函数调用的优势/使用的最佳示例

在main()函数中,两个变量的值为

int a = 33, b = 55;

所以在swap(a,b)函数中使用这些变量,它只是将值传递给函数定义

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

他们再次声明了两个变量x,y,并且交换了这个变量中的值。 但是变量x和y只有在执行swap()函数后才能知道函数swap()变量不再有效。因此,主函数中的变量a,b没有任何反应。

因此,为了使用函数交换变量,你必须使用

swap(&a,&b);
在main()函数中

,并修改函数swap()

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

它传递变量a和b的地址,并且指针用于交换变量,它被有效地交换。由于指针指向变量的地址,变量的值会发生变化。

更多google“通过引用来调用并通过c中的值调用”