Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过参考3维定长阵列传递_C++_C_Function_Multidimensional Array_Pass By Reference - Fatal编程技术网

C++ 通过参考3维定长阵列传递

C++ 通过参考3维定长阵列传递,c++,c,function,multidimensional-array,pass-by-reference,C++,C,Function,Multidimensional Array,Pass By Reference,有人能提示如何通过引用传递这种数组吗 int array[2][3][4]; 这样我可以保存他的指针以便使用和修改数组? 比如,如果我说的是一个整数: // Scope 1 int a = 3; increment(&a); // End Scope 1 // Scope 2 int *pa; void increment(int *tpa) { pa = tpa; *pa++; } // End Scope 2 非常感谢并致以最诚挚的问候。如果您确实希望通过引用传递数组,

有人能提示如何通过引用传递这种数组吗

int array[2][3][4];
这样我可以保存他的指针以便使用和修改数组? 比如,如果我说的是一个整数:

// Scope 1
int a = 3;
increment(&a);
// End Scope 1

// Scope 2
int *pa;
void increment(int *tpa) { 
  pa = tpa; *pa++; 
}
// End Scope 2

非常感谢并致以最诚挚的问候。

如果您确实希望通过引用传递数组,您可以这样做:

void f(int (&a)[2][3][4]) { }
在没有引用的C中,可以通过指针传递数组(当然也用C++来工作):

C++:

C:C中没有参考资料

请注意,无论您如何通过引用或不通过引用传递数组,数组都不会被复制,因此您将获得原始指针。也可以按如下方式传递此数组:

void f(int array[][3][4])
{
}

编辑:我在下面保留我的原始答案,因为我相信人们有必要了解数组是如何实际传递给函数的,以及它们在内存中是如何布局的,但进一步思考后,我认为有一种简单而正确的方法可以完成您想要的任务

将数组封装在结构中,例如

typedef struct ArrayHolderStruct{
    int array[2][3][4];
} ArrayHolder

//...
//scope 1
ArrayHolder thingy;
thingy.array[0] = something;
//other initialization.
F( &thingy );
//...

//scope 2
ArrayHolder *pa;
void F ( ArrayHolder *p ){
    pa = p;
    p->array[0][1][2] = 42;
}

//Call F first to set pa.
void G(){
    pa->array[0][1][2] = 6 * 9; // if pa = &thingy, thingy will be modified.
}
该结构将允许您维护有关封装阵列的布局信息,并且您不必担心糟糕的索引算法

-----旧答案----- 传递对数组的引用是没有用的,除非您想更改数组的大小或布局(对于静态大小的数组,您无论如何都不能这样做)。即使通过“值”传递数组,也会得到数组元素的引用(或指针)。也就是说,如果您声明函数:

void f ( int a[2][3][4] ){
    a[0][1][2] = 42;
}
将其称为
f(array)
f
退出时,
array[0][2][2]
将被设置为42,即使您没有将对
array
的“引用”传递到函数中

如果要保存指向数组的指针以供以后在库函数等中使用,可以执行以下操作:

//scope 2
int * pa;
void f ( int a[2][3][4] ){
    pa = &a[0][0][0];
}
pa[n * 12 + j * 4 + k] = something;
在这一点上它变得很棘手-你必须知道pa在内存中是如何排列的。我认为C已经对“行主顺序”进行了标准化,因此数组应该在内存中进行如下布局:

a[0][0][0] a[0][0][1] a[0][0][2] a[0][0][3] a[0][1][0] ... a[0][2][3] a[1][0][0] a[1][0][1]... a[1][2][3]
因此,要获取索引
[n][j][k]
处的元素,必须执行以下操作:

//scope 2
int * pa;
void f ( int a[2][3][4] ){
    pa = &a[0][0][0];
}
pa[n * 12 + j * 4 + k] = something;
基本上,将每个索引乘以该顺序索引可引用的元素数量,例如,每个
k
索引指向给定固定
j
n
索引的一个元素,每个
j
索引可以指向给定固定
n
索引的4个元素,每个
n
索引可以指向12个元素中的一个(因为12=3*4)


就像我说的,这很棘手。请参阅和上的wikipedia文章,以更好地了解这些内容是如何布置的。

感谢所有参与此活动的人!sskuce利用“容器”提供了一个非常好的解决方案。我已经考虑过了,但不太喜欢额外的东西。 经过一番混乱之后,我意识到詹姆斯·麦克内利斯一直在给出答案。所以以下是我更喜欢的解决方案,没有容器和索引算法(注意括号):


再次感谢大家。

你们回复的速度之快令人惊讶。谢谢。@JoeSlav:欢迎来到StackOverflow:)你应该学会接受最有帮助的答案谢谢James的回答,我在自己的回答中对此进行了扩展。也谢谢Armen的欢迎!我将在这里添加评论,即使是一般性评论。请指定,如何在第二个作用域中声明数组指针,以及如何在函数中传递数组本身?例如(C++)://1inta[2][3][4];乐趣(a);//结束1//2 int(*b)[2][3][4];void fun(int(&a)[2][3][4]){b=a;}//结束2Thanks@JoeSlav-看看我的新答案,我相信它可以完成你想要做的事情(保持对固定长度多维数组的恒定引用),而不用担心索引算法。我不确定你的确切意思。您说需要对数组的引用,但您给出的示例函数
increment
只需要对数组中单个元素的引用(或指针)。e、 g.如果调用
increment(&a[0][1][2])
pa
将被设置为指向该元素的指针。再次感谢。我将尝试更好地解释自己:我在一个类中定义了int a[2][3][4]。我需要将其指针传递给另一个类,以便第二个类可以使用和修改“a”。怎么做?例如,如何定义函数,如何在第二个类中声明指针,以及如何从第一个类传递数组?
void Scope1() 
{
    int array[2][3][4];
    Scope2(&array);
}

int (*pArray)[2][3][4];

void Scope2(int (*tpArray)[2][3][4])) 
{
    pArray = tpArray;
    (*pArray)[0][0][0] = 3;
}