更好地解释C++指针功能

Better explanation of C++ Pointer function?

本文关键字:指针 功能 C++ 解释 更好      更新时间:2023-10-16

我正在为我的C++作业解决一个涉及指针的问题。我不是在要求任何人做我的工作,而只是一些帮助理解问题。

问题是编写一个函数

void sort2(double* p, double* p) //First off I am assuming the second "p" is a typo and       should be a q

此函数将接收两个指针,并对它们指向的值进行排序。例如,如果您调用sort2(&x, &y)则 x <= y 在调用后。

我想知道的是,如果指针已经被函数取消引用,我只是比较 x 和 y 而不是它们的内存地址吗?如果不是,如何比较内存地址?

您正在传递 2xdouble变量的地址,以便sort2()函数可以在源中交换值。

这样,当排序函数被调用时,如下所示:

sort2(&x, &y)

该函数可以访问调用方的内存地址以进行xy,并在必要时交换存储在那里的值。

但是,如果函数只是按获取双精度参数,即

void sort2(double p1, double p2)

然后,尽管函数仍然可以比较和交换值,但sort2()不可能将新值都传递回其当前签名的调用方,因为p1p2被值复制到堆栈上,并且在函数返回时将丢失。

排序函数通过取消引用指针变量的值来访问它们,例如

if (*p1 > *p2) {
// swap / sort etc.
double swap = *p2;
*p2 = *p1;
*p1 = swap;
}

是的,你是对的,第二个p几乎可以肯定是一个错字。

用 like:void sort2(double *p, double *q) {声明一个函数需要两个双指针。当你像这样调用函数时:sort2(&x, &y)你不是在取消引用指针,而是在引用变量。例如:

void sort2(double *p, double *q) {
some_code;
}
int main(int argc, const char *argv[]) {
double x = 0.2;
double y = 0.4;
sort2(&x, &y); //x's and y's addresses in memory are being passed to sort2
return 0;
}

要在事后比较 x 和 y 的内存地址,您必须在这样的某种条件下引用它们:

if(&x <= &y)
do_something;
void sort2(double* p, double* p)

首先,这不是取消引用。这里的 double* 只是为了告诉编译器此函数接收两个指向 double 类型的指针。这是一个宣言。

因此,您将指针本身传递给此处的函数。内存地址存储在 sort2 中的 p 和 q 中。

希望能解决你的问题。

指针不是引用。若要比较指针中存储的值,请使用取消引用运算符,即一元*。C++ 和 C 使用模拟使用的声明语法。所以double *p暗示*pdouble型 .则*p的值是p指向的double对象的值。如果p实际上没有指向一个有效的double,则取消引用的结果是未定义的。

暂时忘记编程和指针,让我们考虑一个库。有很多书架,里面有很多书。每本书都位于一些特定的坐标。例如,《双城记》可能位于P通道、货架 2、插槽 14上;同样,简爱可能在Q 通道、货架 13、插槽 1上。显然,您希望图书馆中的书籍井井有条,以便可以轻松找到它们。

现在考虑一位图书馆员,他的任务是确保上述坐标处的书籍顺序正确。图书管理员转到每个坐标,查看这些坐标处的书名,并确定哪个应该先走。在我们的例子中,图书管理员会注意到,由于JT之前,她需要交换书籍。

你的家庭作业显然是这个C++版本。函数sort2被赋予两个内存地址(即书籍位置),并且它必须确保第一个位置的内容与第二个位置的内容正确比较。("正确比较"通常为"比较小于"或"比较大于",具体取决于您是按升序还是降序排序。

至于sort2怎么称呼,这部分解释起来有点混乱,我的类比并不完美。变量xy通常被认为是数据(例如,书籍的内容),但它们也各自具有关联的地址(例如,书籍所在的位置)。如果键入x,则会询问变量的内容;如果键入&x,则会询问相应的内存地址。与书籍不同,计算机内存一直在变化(当然,这也是计算机如此有用的部分原因)。因此,在这种情况下,xy最好被认为是一个命名的记忆片段,而不是实际数据的名称(例如,它们是书籍位置的名称,而不是书籍的内容)。因此,当您调用sort2(&x, &y)时,地址运算符明确表示您正在xy的位置而不是他们的数据上进行操作。通话后,xy的地址不会更改,但其内容可能会更改。

我希望这有帮助!

在你的void sort2(double* p,double*p)函数中,你应该以不同的方式命名参数名称,如sort2(double *ptr1,double *ptr2)。

然后调用sort2(&x,&y);

在sort2(double* ptr1,double* ptr2)中,您可以交换或排序任何您想要的内容。