C ++通过指针传递和修改值

时间:2012-04-04 13:25:54

标签: c++ pass-by-reference

直到我相信像

这样的方法
bool solverMethod::buildSimplex(double** simplex_ , double* funcEvals_, double* initPt_)
{
  // things
}

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

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

1 个答案:

答案 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 ++中,您必须知道实际的函数签名,以了解引用或值语义是否到位。