我从一本好书中得到了这段代码,但我不明白为什么main函数中的变量与go_south_east
函数中的变量不同,它们被视为相同的变量。
include <stdio.h>
void go_south_east (int *lat, int *lon)
{
*lat = *lat - 1;
*lon = *lon + 1;
}
main()
{
int latitude = 32;
int longitude = -64;
go_south_east (&latitude, &longitude);
printf("Avast! Now at: [%i, %i]\n", latitude, longitude);
return 0;
}
我认为latitude
和lat
是不同的变量。 longitude
和lon
也是如此。那么C怎么知道*lon
,*lat
是&longitude
,&latitude
的引用。对我来说,它应该是lon
在一个函数中,而在第二个函数中应该是lon
。不是吗?
答案 0 :(得分:2)
这是因为您将地址传递给lon
和lat
到该函数。签名中的第一个参数是int *lat
。这与您传递的第一个地址相对应,在您的情况下为latitiude
。
答案 1 :(得分:1)
您误认为传入的实际值的“形式参数”。定义函数时,您指定将在该函数中使用的变量类型和本地名称。此变量名称完全是函数的本地名称,与外部的名称无关。
include <stdio.h>
void go_south_east (int *lat, int *lon)
{
*lat = *lat - 1;
*lon = *lon + 1;
}
第一个变量从堆栈中拉出并放入一个名为lat的局部变量,这是一个指向地址的指针。然后它从堆栈中提取第二个输入变量并将其放入一个名为lat的局部变量中,该变量也是一个整数指针。不是对变量进行更改,而是对计算机中指向的位置进行更改 - 主要位置内的变量位置。
main()
{
int latitude = 32;
int longitude = -64;
go_south_east (&latitude, &longitude);
printf("Avast! Now at: [%i, %i]\n", latitude, longitude);
return 0;
}
经度和纬度是main中的局部变量,这些名称在包含它们的括号之外是看不到的。当你调用go_south_east时,编译器获取纬度的地址和经度的地址(它们是整数指针)并将它们放在堆栈上。然后它调用go_south_east。该函数不会更改已赋予的变量,但会获取地址(即main中的变量)并更改该地址的内容。这就是为什么返回时值已经改变的原因。