更好地解释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;