使用C ++中的指针调用函数

时间:2013-01-02 02:38:03

标签: c++ pointers

非常简单,我正在重新学习C ++,而且我正在指点。我理解基本概念,但我遇到了一些麻烦。 调用此函数的语法是什么?

void getTime(int& hours, int& minutes, int& seconds) const
{
    hours = hr;
    minutes = min;
    seconds = sec;
}

正如您可能已经猜到的,函数的关键是将小时,分钟和秒的时间返回到位于函数调用所在范围内的三个指针。假设hr,min和sec有已经定义了。

此外,如果有人想详细说明指针(特别是何时使用&以及何时使用*),将非常感激。提前谢谢。

4 个答案:

答案 0 :(得分:5)

您的函数签名使用&,表示传递引用。这意味着您只需将您的函数调用为

int h, m, s;

// ... code ...

getTime(h, m, s);

因为您的函数通过引用传递这些参数,所以只要getTime()更改传递的其中一个参数,更改就会传播到函数外部,而不是通过值传递的参数,其中更改仅限于函数范围。 / p>

您可以通过将指针传递给变量来实现类似的效果:

void getTime(int * hours, int * minutes, int * seconds)
{
     // do stuff
}

// ... code ...

int h, m, s;
getTime(&h, &m, &s);

在后一种情况下,&地址 - 运算符。通过取消引用传递的地址,您的函数可以在其功能范围之外更改内存。

答案 1 :(得分:4)

调用该函数的语法是:

className.getTime(a, b, c);

其中className是您定义此方法的类的名称,abc都是整数变量。参数列表中的&符号&表示变量可以修改其值。没有它,您可以修改参数,但不会更改相应的参数。这里没有指针的用途,而不是我能看到的地方。

也许你会混淆参数中的一元 &。一元&所做的是返回其操作数的内存地址。返回的地址恰好是一个指针;但这与你的例子无关。

如果你想使用指针,你必须使用这样的函数签名:

void getTime(int* a, int* b, int* c) const

*这里表示函数接受一个指针(一元*是一个取消引用)。我们会这样称呼:

int *a, *b, *c;

getTime(a, b, c);

或者像这样:

int a, b, c;

getTime(&a, &b, &c);

不同之处在于第一个示例中的变量是指针,因此不需要传递地址。在第二个例子中,我们需要传递地址,因为它提供了一个指向对象的指针。

答案 2 :(得分:1)

这里有的不是指针,而是引用。两者之间存在一些显着差异。首先,引用不能是NULL,它们必须指向已初始化的内容。其次,所需的语法是差异。

例如,如果您使用指针,该函数将具有签名:

void getTime(int* hours, int* minutes, int* seconds) const
{
    hours = &hr;
    minutes = &min;
    seconds = &sec;
}

然后你会这样称呼它:

int hours, minutes, seconds;
hours = minutes = seconds = 0;
getTime(&hours, &minutes, &seconds);

引用以类似的方式运行,也就是说,它们用于更改传入的基础参数,以及避免复制。但语法不同:

int hours, minutes, seconds;
hours = minutes = seconds = 0;
getTime(hours, minutes, seconds); //Notice & not required

你什么时候开始使用?通常,尽可能使用引用,必要时使用指针。在现代C ++中,指针经常被避开以支持其他构造。它们仍然是多态性或直接修改放入容器中的值所必需的(尽管这很可能超越你所处的位置,如果这些都没有意义,那么暂时忽略它。)

传递类或大对象时,请使用reference-to-const。例如,std::vector通常作为void some_func(const std::vector<int>& v)传递。如果您确实需要修改它,请参考void some_func(std::vector<int>& v)

答案 3 :(得分:0)

您的问题中没有指针,但有引用。这个函数的调用方式与使用普通参数完全相同,即:

//assuming an object called object that possesses the function:
//I am assuming its a object-function because of the 'const' modifier

int h, m, s;

object.getTime(h,m,s);

以下是指针和引用之间差异的简要说明:

指针存储另一个变量的内存地址,并使用*字符声明。它们的值是一个整数,表示另一个变量在计算机内存中的位置;要访问此值,您必须取消引用运算符(也是*字符):

int * p; //p stores the location in memory of an int.
p = new int; //pointers must be dynamically allocated to avoid segfaults
p = &(some pre-existing int) //or set to the reference of another variable

*p = 7;//The * is used to access the data the pointer "points to"
delete p; //and must be deleted once they are done being used.

引用就像普通变量一样,它们包含常规数据但不同之处在于它们在传递给函数时保持相同的内存位置(可能还有更多内容,我知道引用在这件事上表现得很好,尽管他们可能有其他定义):

int& i; //i is an int.
i = 7; //and can be assigned like one
//and cannot be dynamically allocated or deleted

希望这有帮助。