2

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

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

正如您可能已经猜到的那样,该函数的要点是将时间(小时、分钟和秒)返回到位于函数调用所在范围内的三个指针。假设已经定义了 hr、min 和 sec .

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

4

4 回答 4

6

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

int h, m, s;

// ... code ...

getTime(h, m, s);

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

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

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

// ... code ...

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

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

于 2013-01-02T02:44:51.003 回答
4

调用函数的语法是:

className.getTime(a, b, c);

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

也许您将参数中的一元 &与一元混淆了。一元的&作用是返回其操作数的内存地址。返回的地址恰好是一个指针;但是,这与您的示例无关。

如果要使用指针,则必须使用如下函数签名:

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);

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

于 2013-01-02T02:43:57.037 回答
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++ 中,通常会避开指针以支持其他构造。对于诸如多态性或直接修改放入容器中的值之类的事情仍然需要它们(尽管这很可能会超出您的位置,如果这些都没有意义,请暂时忽略它)。

当传递一个类或大对象时,使用对常量的引用。因此,例如 astd::vector通常作为 传递void some_func(const std::vector<int>& v)。如果你真的需要修改它,通过引用传递,void some_func(std::vector<int>& v).

于 2013-01-02T02:49:55.080 回答
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

希望这可以帮助。

于 2013-01-02T02:48:50.073 回答