2014-01-27 84 views
0

所以我现在正在学习C语言中的指针,并且在我正在阅读的书中有一个示例程序,但是当它运行时它不起作用。该代码是:C指针(简单程序)

#include <stdio.h> 
#include <stdlib.h> 
    void go_south_east(int *lat, int *lon) 
    { 
    *lat = *lat - 1; 
    *lon = *lon + 1; 
} 
int main(){ 
    int latitude = 64; 
    int lontitude = -32; 
    go_south_east(&latitude, &lontitude); 
    printf("Now at [%i, %i]\n", latitude, lontitude); 
    return 0; 
    system("pause"); 
} 

的想法是,这些“纬度和lontitude”是一个对象的坐标,我们想把它移到南east.I个人认为这是错行:

go_south_east(&latitude, &lontitude); 

为什么我们需要变量的地址? 而关于这一行一个问题:

printf("Now at [%i, %i]\n", latitude, lontitude); 

是什么%I这里的意思是不是应该为整数值%d?

+0

请参阅函数 –

+1

的签名您能否详细说明“运行时不能正常工作”。 ? '%d'和'%i'都是整数的格式说明符。 –

+0

程序'[6692] korab.c.exe'已退出,代码为0(0x0)。 - 这是我得到的消息 –

回答

0

有参数传递给函数的方式有三种:

  • 值传递
  • 路过指针
  • 引用传递

您的程序正在使用擦肩而过指针。

值传递是这样的:

void go_south_east(int lat, int lon) 
{ 
    lat = lat - 1; 
    lon = lon + 1; 
} 

如果您改变了方案,把上面的代码,你将看到的是printf()的输出:“现在,在[64,-32]”。这是因为您只通过了您的lat & lon的 - 实际上是它们的值的副本。该功能会更改副本的值,并且不会影响原件。

通过指针传递,您将存储原始纬度值的内存地址传递给您的函数。该功能修改存储在这些位置的数据。这就是main()中lat的当前值改变的原因。

+0

从您链接的页面:“* C不支持通过引用[...] *”传递! – alk

2
go_south_east(&latitude, &lontitude); 

我们需要变量的地址,因为您要通过引用传递它们,因为您想要修改它们的值。你不想只给两个数字的功能,你希望它能够改变它们。所以你需要通知这些变量所在的函数(它们的地址),以便函数可以修改它们的值。

它正常工作,因为输出是Now at [63, -31],所以函数正确地红色传递的值并更新它们。

+0

C中没有“引用*参考*”。您传入地址,指针。这些指针是按值传递的。然而措辞“*通过引用某些事物*”就可以。 – alk

+0

是的,严格来说你是对的。无论如何,即使不是100%正确的,通常也更容易说“通过参考”。从维基百科:“传递参考是通过显式传递指针值在C中模拟。” – fede1024