c - 为什么 'z'中存储的值为35?难道不应该是20吗,因为在函数 'c=*b'中(c等于*b指向的值)?

标签 c pointers

在下面的代码中:

#include <stdio.h> 

void shuffle(int* a, int* b, int c) {
   int temp = *a;
   *a = *b + c;
   c = *b;
   *b = temp;
} 

int main() {
   int x = 10;
   int y = 20;
   int z = 35;
   shuffle(&x,&y,z);
   printf("x: %i\n", x);
   printf("y: %i\n", y);
   printf("z: %i\n", z);
   return 0;
}

“z”的值仍然是 35。为什么会这样呢?该值不应该是20吗?自:

c = *b;

最佳答案

当您传递 a、b 和 c 作为参数时,您会注意到 int c 不是作为指针传递的。在 C 中,参数可以通过两种方式传递。

第一个是引用传递参数,该参数作为变量的地址传递,对该地址的内容所做的任何更改即使在函数之外也将持续存在。

第二种方法是将其作为按值参数传递,在这种情况下,您只需将“传递”变量的内容创建到另一个变量的副本。

现在,int* a 作为引用传递(因为它是一个指针),假设 a=0x12341234(a 的地址),其值为 10,再一次,int c(不是指针)的地址为 0x10101010,值为 35。 然后,当我们用a作为指针,c作为普通整数来调用我们的函数时,我们可以发现函数内部a的地址是0x12341234,但是c的地址现在是0x20202020(例如)。我们在内存的另一个地方创建了 c 的副本。修改复制的变量不会修改原始变量。这就像:

int original = 20;
int copy = original;//we see that copy is a COPY of original
copy = 321;//Original still being 20

关于c - 为什么 'z'中存储的值为35?难道不应该是20吗,因为在函数 'c=*b'中(c等于*b指向的值)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58258465/

相关文章:

C 套接字 - 保留连接池以供重用 - s

python - 如何在 C/C++ 应用程序中使用 Pygtk?

c++ - 从旧书中学习c++

c - 如何在 u-boot 中启用 source 和 bootm 命令?

c++ - 将 LONG 转换为函数指针?

c - 将二维动态数组的一维传递给函数

c - 错误[e46] : Undefined external "set_all_ports" referred in GPIO main

c++ - 适用于 begin() 但不适用于 rbegin() 的映射迭代器

c - 具有结构体和 int 的共享内存

java - 客户端-服务器应用程序空指针异常