更好地解释C++指针功能
Better explanation of C++ Pointer function?
我正在为我的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)
该函数可以访问调用方的内存地址以进行x
和y
,并在必要时交换存储在那里的值。
但是,如果函数只是按值获取双精度参数,即
void sort2(double p1, double p2)
然后,尽管函数仍然可以比较和交换值,但sort2()
不可能将新值都传递回其当前签名的调用方,因为p1
和p2
被值复制到堆栈上,并且在函数返回时将丢失。
排序函数通过取消引用指针变量的值来访问它们,例如
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
暗示*p
是double
型 .则*p
的值是p
指向的double
对象的值。如果p
实际上没有指向一个有效的double
,则取消引用的结果是未定义的。
暂时忘记编程和指针,让我们考虑一个库。有很多书架,里面有很多书。每本书都位于一些特定的坐标。例如,《双城记》可能位于P通道、货架 2、插槽 14上;同样,简爱可能在Q 通道、货架 13、插槽 1上。显然,您希望图书馆中的书籍井井有条,以便可以轻松找到它们。
现在考虑一位图书馆员,他的任务是确保上述坐标处的书籍顺序正确。图书管理员转到每个坐标,查看这些坐标处的书名,并确定哪个应该先走。在我们的例子中,图书管理员会注意到,由于J在T之前,她需要交换书籍。
你的家庭作业显然是这个C++版本。函数sort2
被赋予两个内存地址(即书籍位置),并且它必须确保第一个位置的内容与第二个位置的内容正确比较。("正确比较"通常为"比较小于"或"比较大于",具体取决于您是按升序还是降序排序。
至于sort2
怎么称呼,这部分解释起来有点混乱,我的类比并不完美。变量x
和y
通常被认为是数据(例如,书籍的内容),但它们也各自具有关联的地址(例如,书籍所在的位置)。如果键入x
,则会询问变量的内容;如果键入&x
,则会询问相应的内存地址。与书籍不同,计算机内存一直在变化(当然,这也是计算机如此有用的部分原因)。因此,在这种情况下,x
和y
最好被认为是一个命名的记忆片段,而不是实际数据的名称(例如,它们是书籍位置的名称,而不是书籍的内容)。因此,当您调用sort2(&x, &y)
时,地址运算符明确表示您正在x
和y
的位置而不是他们的数据上进行操作。通话后,x
和y
的地址不会更改,但其内容可能会更改。
我希望这有帮助!
在你的void sort2(double* p,double*p)函数中,你应该以不同的方式命名参数名称,如sort2(double *ptr1,double *ptr2)。
然后调用sort2(&x,&y);
在sort2(double* ptr1,double* ptr2)中,您可以交换或排序任何您想要的内容。
- 链表删除功能的单指针 // 是可能的
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- char* 除了作为C++中的指针之外,还有其他功能吗?
- 具有小对象优化功能的智能指针
- 如何定义和设置指向模板类方法的功能指针
- 将状态传递给功能指针
- 如何使用指针向量为班级制作复制功能
- 我对C 中共享指针列表进行排序的功能未完成类型
- 如何使用结构内的功能指针调用私有函数
- 如何将自己的智能指针传递到功能
- 模板功能以检查智能指针是否为空
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- 功能指针不起作用(C )
- 将C 方法作为功能指针传递
- 字符指针功能以复制C 中的字符串
- 指针?指针功能
- 反向指针功能问题
- 无效指针功能的输出
- 更好地解释C++指针功能
- 用memcpy c 读取并写入指针功能