更好地解释C++;指针函数? 我正在为我的C++作业设计一个涉及指针的问题。我不是要求任何人来做我的工作,只是要求一些人帮助我理解这个问题

更好地解释C++;指针函数? 我正在为我的C++作业设计一个涉及指针的问题。我不是要求任何人来做我的工作,只是要求一些人帮助我理解这个问题,c++,c,pointers,C++,C,Pointers,问题是写一个函数 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指针不是引用。要比较指针中存储的值,可以使用解引用运算符,即一元*。C++和C使用模仿语法的声明语法。因此,double*p提示*p属于double类型。那么*p的值就是

问题是写一个函数

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指针不是引用。要比较指针中存储的值,可以使用解引用运算符,即一元
*
。C++和C使用模仿语法的声明语法。因此,
double*p
提示
*p
属于
double
类型。那么
*p
的值就是
p
指向的
double
对象的值。如果
p
实际上没有指向有效的
double
,则取消引用的结果未定义

void sort2(double* p, double* p)
首先,这不是反引用。这里的double*只是告诉编译器这个函数接收指向double类型的两个指针。它是一个声明

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


希望这能解决您的问题。

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

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

sort2(&x, &y)
该函数可以访问调用方的
x
y
内存地址,并在必要时交换存储在那里的值

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

然后,尽管函数仍然可以比较和交换周围的值,
sort2()
无法将这两个新值及其当前签名传递回调用者,因为
p1
p2
是按值复制到堆栈上的,并且在函数返回时会丢失

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

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

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

暂时忘记编程和指针,让我们考虑一下库。有很多书架和很多书。每本书都位于特定的坐标上。例如,《双城记》可能在P通道,2号货架,14号槽;类似地,简爱可能在13号货架1号槽Q通道。显然,你希望图书馆里的书组织得井井有条,以便容易找到

现在考虑一个图书管理员,负责确保上述坐标的图书是正确的。图书管理员走到每个坐标系,查看这些坐标系下的书名,并确定应该先看哪一本。在我们的例子中,图书管理员会注意到,由于J在T之前,她需要交换图书

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

至于如何调用
sort2
,这一部分解释起来有点混乱,我的类比并不完美。变量
x
y
通常被认为是数据(例如,一本书的内容),但它们都有一个相关的地址(例如,书所在的位置)。如果键入
x
,则要求输入变量的内容;如果键入
&x
,则需要相应的内存地址。与书籍不同的是,计算机内存一直在变化(当然,这也是计算机如此有用的部分原因)。因此,在这种情况下,
x
y
被认为是一段命名的内存,而不是实际数据的名称(例如,它们是书籍位置的名称,而不是书籍内容)。因此,当您调用
sort2(&x,&y)
时,操作符的地址明确表示您是在
x
y
的位置上操作,而不是在它们的数据上操作。通话后,
x
y
的地址不会改变,但它们的内容可能会改变


我希望这有帮助

用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;
如果(&x在void sort2(double*p,double*p)函数中,参数名称应该与sort2(double*ptr1,double*ptr2)不同

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


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

为什么要比较它们的内存地址?什么是“如果指针已经被函数反引用了”?您应该比较x和y,而不是它们的地址。这里使用术语
reference
可能会令人困惑。
if(&x <= &y)
  do_something;