直到我相信像
这样的方法bool solverMethod::buildSimplex(double** simplex_ , double* funcEvals_, double* initPt_)
{
// things
}
会在调用它的方法中更改simplex,funcEvals_,initPt_的值(通过指针传递)。我错了吗?怎么说呢?
感谢和问候并为简单的问题道歉。
答案 0 :(得分:3)
这可能不是一个答案,因为它是对指针,引用和引用语义的一般解释。
如果函数可以更改传递给它的参数对象,则称该函数具有引用语义。例如,如果以下swap
函数交换值,则它们具有引用语义:
int x = 4;
int y = 8;
swap(x, y);
assert(x == 8 && y == 4);
问题是你如何实现引用语义。 C ++有一个本机引用类型,使其非常自然:
void swap(int & a, int & b) { int t = a; a = b; b = t; }
相比之下,C没有这样的原生特征,并且 C中的每个对象都是按值传递的。但是,C具有可用于实现引用语义的不同功能,即指针:对于每个类型T
,都有一个相关类型{{1通过地址 - 类型为T*
的对象:T
,可以获得其值。现在,您可以按值传递这些指针对象,并使用它们来访问它们指向的原始对象。请注意,我们按值传递指针!
int x; int * p = &x;
我们必须以不同的方式调用函数:void c_swap(int * p, int * q) { int t = *p; *p = *q; *q = t; }
。因此,在C中,您始终可以判断是否正在修改参数,因为执行此操作的唯一方法是将其地址传递给函数。在C ++中,您必须知道实际的函数签名,以了解引用或值语义是否到位。