C将指针传递给函数混淆

标签 c pointers parameter-passing

我在这里有点困惑。这是一本很棒的 C 书,也许我对它质疑太多,但不知何故它没有意义。希望能说出我的困惑。

下面假设&a指向内存地址87,&b指向内存地址120;

int a = 3;
int b = 4;
swap(&a, &b);

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

好的,问题来了:当我们调用函数 swap 并将参数传递给函数时,我们实际上是将“px”设置为 87 还是将“*px”设置为 87?

因为如果我们将 *px 设置为 87 那么根据 * 符号的定义,我们设置的是指针指向的值,而不是 p 所持有的内存地址,这是错误的这个例子。另一方面,如果我们实际上将“p”设置为 87,那么 swap 中的代码就有意义了,因为当我们在函数中使用 * 符号时,我们将引用该地址中的值“3”这里。但是那为什么语法困惑,看起来好像我们在设置

*px = 87

?

最佳答案

如果 a 位于地址 88(需要正确对齐)并且 b 位于地址 120,则:

                                //   a   |   b   |   px   |  py   | temp
int a=3;                        //   3       --      --       --     --
int b=4;                        //   3       4       --       --     --
swap(&a, &b);                   //   4       3       --       --     --

void swap(int *px, int *py)
{                               //   3       4       88      120    --
  int temp;
  temp = *px;                   //   3       4       88      120     3
  *px = *py;                    //   4       4       88      120     3
  *py = temp;                   //   4       3       88      120     3
}

px&a88,永远不会改变。 *px 指代(别名)a。它可以重新命名为不同的变量,但这段代码不会那样做。

参数为px,类型为int*。参数不是*px。出于这个原因,许多程序员将其写为 int* px 而不是 int *px。调用 swap(&a, &b) 的效果是 px = &a 而不是 *px = &a

但请注意,C 没有“方法”,只有“函数”。

关于C将指针传递给函数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6574500/

相关文章:

c++ - 指针算术和冒泡排序 (C++)

c++ - 是否可以调用具有不同数量参数的函数,传递相同的参数包

c++ - CUDA 结果使用非常大的数组返回垃圾,但没有报告错误

objective-c - 多线程、采样和基本软件问题

pointers - 如何取消引用作为空接口(interface)传递的指针值?

将指针强制转换为 long *

java - Java 如何自动回答用户提示?

c - 这些参数在 Linux 中究竟意味着什么?

C 数组/指针声明语法测验

c - 从 scanf 输入值但打印不同的值