更好地解释C ++指针函数?

时间:2014-02-11 03:26:43

标签: c++ c pointers

我正在处理涉及指针的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而不是它们的内存地址吗?如果不是我如何比较内存地址?

6 个答案:

答案 0 :(得分:4)

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

这样,当像这样调用sort函数时:

sort2(&x, &y)

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

但是,如果函数只是通过 value 采用双参数,即

void sort2(double p1, double p2)

然后,虽然函数仍然可以比较和交换周围的值,但是sort2()无法通过其当前签名将新值传回给其调用者,因为p1和{ {1}}按值复制到堆栈中,并在函数返回时丢失。

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

p2

是的,你是对的,第二个if (*p1 > *p2) { // swap / sort etc. double swap = *p2; *p2 = *p1; *p1 = swap; } 几乎肯定是一个错字。

答案 1 :(得分:3)

使用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;

答案 2 :(得分:2)

void sort2(double* p, double* p)

首先。这不是解除引用。 double *这里只告诉编译器这个函数接收两个指向double类型的指针。它是一个声明。

所以你将指针本身传递给函数。内存地址存储在sort2中的p和q中。

希望能解决你的问题。

答案 3 :(得分:1)

指针不是参考。要比较存储在指针中的值,可以使用解除引用运算符,它是一元*。 C ++和C使用模仿使用的声明语法。因此double *p给出了*p属于double类型的提示。然后,*p的值是double指向的p对象的值。如果p实际上没有指向有效的double,则取消引用的结果是未定义的。

答案 4 :(得分:1)

暂时忘记编程和指针,让我们考虑一下库。有很多货架上摆满了很多书。每本书都位于某些特定的坐标。例如,双城记可能位于 Aisle P,Shelf 2,Slot 14 ;同样, Jane Eyre 可能会出现在 Aisle Q,Shelf 13,Slot 1 上。显然,您希望图书馆中的书籍组织得很好,以便能够轻松找到它们。

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

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

至于如何调用sort2,这部分解释起来有点混乱,而且我的比喻并不完美。变量xy通常被认为是数据(例如,书籍的内容),但它们每个也具有相关联的地址(例如,书籍的位置)。如果键入x,则要求输入变量的内容;如果键入&x,则需要相应的内存地址。与书本不同,计算机内存一直在变化(这当然是计算机如此有用的部分原因)。因此,在这种情况下,xy最好被认为是一个命名的记忆片段,而不是实际数据的名称(例如,它们是书籍位置的名称,而不是书的内容)。因此,当您致电sort2(&x, &y)时,运营商地址会明确表示您正在xy位置而非他们的数据。通话结束后,xy的地址不会发生变化,但内容可能会有变化。

我希望这有帮助!

答案 5 :(得分:1)

在void sort2(double * p,double * p)函数中,您应该将参数名称命名为sort2(double * ptr1,double * ptr2)。

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

在sort2(double * ptr1,double * ptr2)中,你可以交换或排序你想要的东西。