使用"地址"将2D数组传递给c ++作为内存块。操作者

时间:2018-06-17 03:10:31

标签: c++ arrays 2d

为了将2D数组传递给C ++函数,有一种方法可以将整个内存块传递为:

void functionname(double (&arrayname)[10][10])

对于这个函数定义,函数原型和函数调用是什么?

最常见的方式是

**arrayname
(*arrayname)[columns]
arrayname[][columns]

但是作为内存块的传递看起来很少使用。

1 个答案:

答案 0 :(得分:0)

您可以使用

void functionname(double (&arrayname)[10][10]) { ... }

顺便说一句,函数声明中的&不是addressof运算符。它定义了一个引用类型。

以下程序应该成功构建。

void functionname(double (&arrayname)[10][10])
{
}

int main()
{
   double a[10][10];
   functionname(a);
}

使用此类函数声明的唯一缺点是您不能使用精确匹配这两个维度的数组。你不能使用

   double a[20][10];  // Size mismatch.
   functionname(a);

使用

void functionname(double **arrayname);
void functionname(double (*arrayname)[10]);
void functionname(double arrayname[][10]);

有他们的目的,但更重要的是,他们并不等同。

为了简化答案,假设你有不同的名字。

void function_one(double **arrayname);
void function_two(double (*arrayname)[10]);
void function_three(double arrayname[][10]);

你有以下四种类型的对象。

double** array_one;
double (*array_two)[10];
double* array_three[10];
double array_foure[10][10];

// Assume array_one, array_two and array_three are properly initialized.

然后,

function_one(array_one);      // OK.
function_one(array_two);      // Not OK. array_two does not decay to double**
function_one(array_three);    // OK. array_three decays to double**
function_one(array_four);     // Not OK. array_four does not decay do double**

function_two(array_one);      // Not OK. array_one cannot be converted to double (*)[10]
function_two(array_two);      // OK.
function_two(array_three);    // Not OK. array_three cannot be converted to double (*)[10]
function_two(array_four);     // Not OK. array_four cannot be converted to double (*)[10]
function_two(&array_four[0]); // OK. array_four[0] is type double [10].
                              // &array_four[0] is of type double (*)[10].

function_three(array_one);    // Not OK.
function_three(array_two);    // Not OK.
function_three(array_three);  // Not OK.
function_three(array_four);   // OK.

总之,功能类似,因为它们允许您使用2D阵列,但有必要了解它们的不同之处,以便它们可以正确使用。