我在这里有点困惑。这是一本很棒的 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
是 &a
即 88
,永远不会改变。
*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/