示例中的变量语法不清楚

时间:2014-03-13 01:14:53

标签: c variables pointers

我从一本好书中得到了这段代码,但我不明白为什么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;
}

我认为latitudelat是不同的变量。 longitudelon也是如此。那么C怎么知道*lon*lat&longitude&latitude的引用。对我来说,它应该是lon在一个函数中,而在第二个函数中应该是lon。不是吗?

2 个答案:

答案 0 :(得分:2)

这是因为您将地址传递给lonlat到该函数。签名中的第一个参数是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中的变量)并更改该地址的内容。这就是为什么返回时值已经改变的原因。