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

Calling a function using pointers in C++

本文关键字:指针 调用 函数 C++      更新时间:2023-10-16

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

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

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

此外,如果有人想详细说明一下指针(特别是何时使用和何时使用*(,将不胜感激。 提前谢谢。

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

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

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

调用该函数的语法为:

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

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

你在这里看到的不是指针,而是引用。两者之间存在一些显着差异。首先,引用不能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++中,指针经常被避开,而支持其他结构。它们仍然是多态性或直接修改放置在容器中的值之类的东西所必需的(尽管这很可能领先于您的位置,如果这些都没有意义,请暂时忽略它(。

传递类或大型对象时,请使用对常量引用。因此,例如,std::vector通常作为void some_func(const std::vector<int>& v)传递。如果确实需要修改,请按引用传递,void some_func(std::vector<int>& v) .

你的问题中没有指针,但有参考资料。此函数的调用方式与采用正常参数完全相同,即:

//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

希望这有帮助。