将多维指针数组的指针传递给函数

时间:2018-03-08 23:35:02

标签: c++ arrays pointers

好吧假设我有一个函数myFunction。然后在main我有一个多维指针数组。我想将指针数组传递给myFunction。我该怎么办?我知道如果你想将int传递给我的函数,可以将函数写为

myfunct( int x) { ...}

如果我必须将指针传递给指针数组,那x类型会是什么?提前致谢:D

4 个答案:

答案 0 :(得分:0)

通常,您希望修改数组的元素,而不是实际的指针。实际指针由malloc给出,如果你改变它,通过直接写入值,它不会影响内存分配(除了你可能会松开初始指针......)。

这可能是你在二维阵列中寻找的东西。

void myfunct(int** ptr,int items, int array_items)
{
    //some code
}
int main(int argc, char *argv[])
{
    const auto items = 5;
    const auto array_items = 7;
    int** multi_dimensional_array = reinterpret_cast<int**>(std::malloc(items * sizeof(int*)));
    for (auto i = 0 ;i < items;++i)
    {
        multi_dimensional_array[i] = static_cast<int*>(std::malloc(sizeof(int) * array_items));
    }
    myfunct(multi_dimensional_array,items,array_items);
    //deallocate
}

答案 1 :(得分:0)

将多维数组包装在类中。这样你可以在一个块中携带数据和维度并传递它就像在任何其他类中移动一样简单。

请务必注意the Rules of Three, Five, and Zero,以最适用于您在班级中存储阵列的方式为准。 public class Main extends AppCompatActivity implements View.OnClickListener { DatabaseReference databaseReference; public static final String Database_Path = "All_Image_Uploads_Database"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); databaseReference = FirebaseDatabase.getInstance().getReference(Database_Path); 是个人的最爱,因为它允许您使用零规则。

例如:

std::vector

答案 2 :(得分:0)

要直接回答您的问题,对于int *的向量,通常传递的类型为int,对于int **

的2D数组,通常为int
void myfunct( int **x) 
{ 
    x[2][1] = 25;
    return;
}

如果由于某种原因你希望它是一个int指针数组而不是int,你需要额外的*。

void myfunct( int ***x) 
{ 
    *(x[2][1]) = 25;
    return;
}

答案 3 :(得分:0)

让我首先尝试解释您想要处理的确切类型。我想在你的main函数中有一个&#34;多维数组&#34;它存储每个元素的指针。举个例子,假设你有一个指向整数类型的三维数组。

假设您知道数组的大小:

C样式数组将如下所示:

int *a[4][3][2];

这意味着a是一个4x3x2数组,数组中的每个元素都是一个指向整数的指针。总的来说,你现在总共有24个指向整数的指针,通过测试sizeof(a) / sizeof(int*)的结果可以看出(结果应该是24)。好的,到目前为止一切顺利。但是现在我想你想要的是指向上面提到的数组a的指针,比如b,所以定义了b

int *(*b)[4][3][2] = &a;

请注意,尽管现在b看起来令人生畏,但最后它只是一个只存储地址的指针,sizeof(b) / sizeof(int*)给出1作为结果。 (括号内的*表示b是指针类型,因此b是指向&#34;多维数组&#34;指向整数的指针。)

现在要将b传递给myFunction,只需在声明中提供相同类型的b作为参数类型:

void myFunction(int *(*x)[4][3][2]) {
    // do something
}

那就是它!您可以直接使用myFunction(b)来调用此函数。此外,您可以测试myFunction内部,x仍然是一个指针的大小,而*x的大小为24个指针。

*请注意,由于我们将一个指向数组类型的指针传递给函数,因此数组到指针的衰减在这里不适用。

假设您在编译时不知道数组的大小:

假设您有int N1 = 4, N2 = 3, N3 = 2;并且想要初始化指向整数的N1xN2xN3指针数组,则不能直接在堆栈上执行此操作。

您可以按照@ Mikhail的回答中的建议初始化使用newmalloc,但该方法为多维数组采用嵌套循环,并且在释放内存时需要再次执行嵌套循环。因此,@ user4581301建议,std::vector为动态大小数组提供了一个很好的包装器,它不需要我们自己释放内存。呀!

可以用这种方式编写所需的数组a(看起来仍然很难看,但没有明确的循环,也没有释放内存)

std::vector<std::vector<std::vector<int*>>> a (N1,
    std::vector<std::vector<int*>> (N2,
        std::vector<int*> (N3)
    )
);

现在,b(指向a的指针)可以写为

auto *b = &a;

您现在可以使用

传递b
void myFunction(std::vector<std::vector<std::vector<int*>>>* x) {
    // do something
}

请注意,*之前的x表示x是指针。