2

直到那里我信任这种方法

bool solverMethod::buildSimplex(double** simplex_ , double* funcEvals_, double* initPt_)
{
  // things
}

会在调用它的方法中更改 simplex、funcEvals_、initPt_ 的值(通过指针传递)。我错了吗?那怎么放呢?

感谢和问候并为简单的问题道歉。

4

1 回答 1

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,都有一个相关的类型T*,可以通过获取类型对象的地址T来获得其值:int x; int * p = &x;。现在您可以按值传递这些指针对象,并使用它们来访问它们指向的原始对象。请注意,我们是按值传递指针!

void c_swap(int * p, int * q) { int t = *p; *p = *q; *q = t; }

我们必须以不同的方式调用该函数:swap(&x, &y). 因此,在 C 语言中,您始终可以判断参数是否正在被修改,因为这样做的唯一方法是将其地址传递给函数。在 C++ 中,您必须知道实际的函数签名才能知道引用或值语义是否到位。

于 2012-04-04T13:43:27.187 回答