我正在处理涉及指针的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而不是它们的内存地址吗?如果不是我如何比较内存地址?
答案 0 :(得分:4)
您正在传递2x double
变量的地址,以便sort2()
函数可以交换源的值。
这样,当像这样调用sort函数时:
sort2(&x, &y)
该函数可以访问调用者的x
和y
的内存地址,并在必要时交换存储在那里的值。
但是,如果函数只是通过 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
,这部分解释起来有点混乱,而且我的比喻并不完美。变量x
和y
通常被认为是数据(例如,书籍的内容),但它们每个也具有相关联的地址(例如,书籍的位置)。如果键入x
,则要求输入变量的内容;如果键入&x
,则需要相应的内存地址。与书本不同,计算机内存一直在变化(这当然是计算机如此有用的部分原因)。因此,在这种情况下,x
和y
最好被认为是一个命名的记忆片段,而不是实际数据的名称(例如,它们是书籍位置的名称,而不是书的内容)。因此,当您致电sort2(&x, &y)
时,运营商地址会明确表示您正在x
和y
的位置而非他们的数据。通话结束后,x
和y
的地址不会发生变化,但内容可能会有变化。
我希望这有帮助!
答案 5 :(得分:1)
在void sort2(double * p,double * p)函数中,您应该将参数名称命名为sort2(double * ptr1,double * ptr2)。
然后调用sort2(&amp; x,&amp; y);
在sort2(double * ptr1,double * ptr2)中,你可以交换或排序你想要的东西。