我正在编写一个程序来移动以循环方式输入的数字,我知道如何使用按值调用,但我无法通过引用方式调用逻辑
这是代码:
#include<stdio.h>
int shift(int *a, int *b, int *c);
void main()
{
int x, y, z;
printf("Enter x: ");
scanf("%d", &x);
printf("Enter y: ");
scanf("%d", &y);
printf("Enter z: ");
scanf("%d", &z);
printf("Before Shift: x: %d\ty: %d\t z: %d",x,y,z);
//call the shift function
shift(&x, &y, &z);
printf("\n After Shift: x: %d\ty: %d\t z: %d",x,y,z);
}
int shift(int *a, int *b, int *c)
{
int temp;
temp = *c;
*c = *b;
*b = *a;
*a = temp;
}
在代码的最后一部分,移位函数的确切含义是什么以及地址是如何从一个变量移动到另一个变量的。
在 C 中,变量按值传递到函数中。请参阅按引用传递与按值传递之间有什么区别?具体来说,让我们为了说明目的重新编写该程序。
#include <stdio.h>
static void fail(int t, int u, int v)
{ int temp; temp = v; v = u; u = t; t = temp; }
static void shift(int *a, int *b, int *c)
{ int temp; temp = *c; *c = *b; *b = *a; *a = temp; }
int main(void) {
int x = 1, y = 2, z = 3;
printf("Before: x: %d\ty: %d\t z: %d\n",x,y,z);
fail(x, y, z);
printf("fail: x: %d\ty: %d\t z: %d\n",x,y,z);
shift(&x, &y, &z);
printf("shift: x: %d\ty: %d\t z: %d\n",x,y,z);
}
从
fail
调用 main
,将值 (x, y, z)
复制到 (t, u, v)
。 (t, u, v)
被排列,但当函数超出范围并且 fail
返回到 main
时被销毁。原始值不变。
程序然后从
shift
调用main
,并将(&x, &y, &z)
的地址传递给(a, b, c)
;取消引用 (*a, *b, *c)
中的 shift
是 (x, y, z)
中的 main
。变量已正确排列。