任何人都可以提示如何通过引用传递一种类型的数组
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
非常感谢和最诚挚的问候。
答案 0 :(得分:8)
如果你真的想通过引用传递数组,你可以这样做:
void f(int (&a)[2][3][4]) { }
在C中,没有引用,你可以通过指针传递数组(当然这也适用于C ++):
void f(int (*a)[2][3][4]) { }
答案 1 :(得分:3)
C ++:
void f(int (&array)[2][3][4])
{
}
C:C中没有引用
请注意,无论您如何通过引用传递数组,都不会复制数组,因此您将获得原始指针。您也可以像这样传递此数组:
void f(int array[][3][4])
{
}
答案 2 :(得分:2)
感谢所有参与此活动的人! sskuce提供了一个非常好的解决方案,利用了“容器”。我曾经想过这个,但并不喜欢额外的东西。 我意识到詹姆斯麦克纳利斯一直都给出了答案。所以...这是我更喜欢的解决方案,没有容器,也没有索引算法(请注意括号):
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;
}
再次感谢大家。
答案 3 :(得分:1)
编辑:我在下面保留我的原始答案,因为我认为人们有必要了解数组如何实际传递给函数以及它们如何在内存中布局,但是在进一步反思时我认为有一个简单的并且正确地获得你想要的东西。
将数组封装在结构中,例如
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.
}
结构将允许您维护有关封装数组的布局信息,并且您不必担心讨厌的索引算法。
-----老答案----- 传递对数组的引用是没有用的,除非您想要更改数组的大小或布局(无论如何都不能使用静态大小的数组)。即使您通过“value”传递数组,也会得到数组元素的引用(或指针)。也就是说,如果你声明你的功能:
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是如何在内存中放置(奠定?)的。我认为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]
处的元素,您必须执行以下操作:
pa[n * 12 + j * 4 + k] = something;
基本上,将每个索引乘以该订单的索引可以引用的元素数,例如给定固定k
和j
索引时,每个n
索引都指向一个元素,每个j
索引可以指向给定固定n
索引的4个元素,每个n
索引可以指向12个(因为12 = 3 * 4)个元素中的一个。