【问题标题】:can i represent multi dimension array using pointers?我可以使用指针表示多维数组吗?
【发布时间】:2014-05-21 00:46:54
【问题描述】:

鉴于以下代码,我试图了解指针操作是否合法:

struct Foo{
 int *temp1;
}

temp1 => 二维数组

struct Foo1{
 int temp1[2][2];
}

temp1 => 3d 数组

struct Foo2{
 int temp1[3][2][3];
}

我使用静态数据为 Foo1 和 Foo2 赋值。例如:

Foo1 f1 =
{
 { 2, 4 },
 { 1, 3 }
};

Foo2 f2 = 
{
   {
       {
           {101, 102, 103},
           {104, 105, 106},
       },
       {
           {107, 108, 109},
           {110, 111, 112},
       },
       {
           {113, 114, 115},
           {116, 117, 118},
       },
   }
};

我可以像这样引用来自 Foo1 的 Foo 数据吗:

Foo f;
f.temp1 = (int*)f1.temp1;
for(int i = 0; i < 2; ++i)
{
 for(int j = 0; j < 2; ++j)
 {
  cout << "i " << i << " j " << j << " value: " << f.temp1[(i * 2) + j] << endl;
 }
}

我可以像这样引用来自 Foo2 的 Foo 数据吗:

Foo f;
f.temp1 = (int*)f2.temp1;
for(int i = 0; i < 3; ++i)
{
 for(int j = 0; j < 2; ++j)
 {
   for(int k = 0; k < 3; ++k)
   {
    cout << "i " << i << " j " << j << " k " << k << " value: " << f.temp1[(i * 3 * 2) + (j * 2) + k] << endl;
   }
 }
}

基本上,我假设数组将排列在连续的内存中,我可以像这样取消引用它吗?

【问题讨论】:

  • 你有充分的理由使用 STD 容器吗?
  • @Biffen:是的。如果我使用向量(不,也不能使用 c++1x),我将不得不将数据复制到那些容器中,这对于这个要求来说是一个很大的禁忌。我有很多数据,将其复制到这些容器中需要很长时间,这在我的环境中是不可接受的。
  • 听起来是个好理由。 :)

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

this question 的答案表明答案是。假设多维数组使用[size1][size2][size3] 表示法声明,它们确实在内存中连续布局。

根据经验,答案也是是的。考虑以下代码,我将您在问题中编写的片段拼凑在一起编写。

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;
struct Foo {
    int *temp1;
};

struct Foo1{
    int temp1[2][2];
};

struct Foo2{
    int temp1[3][2][3];
};


Foo1 f1 =
{
    {
        { 2, 4 },
        { 1, 3 }
    }
};
Foo2 f2 = 
{
    {
        {
            {101, 102, 103},
            {104, 105, 106},
        },
        {
            {107, 108, 109},
            {110, 111, 112},
        },
        {
            {113, 114, 115},
            {116, 117, 118},
        },
    }
};


int main(){


    int* temp1 = (int*) f1.temp1;
    for(int i = 0; i < 2; ++i)
        for(int j = 0; j < 2; ++j)
            cout << "i " << i << " j " << j << " value: " 
                << temp1[(i * 2) + j] << endl;

    temp1 = (int*) f2.temp1;
    cout << endl;
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 2; ++j)
            for(int k = 0; k < 3; ++k)
                cout << "i " << i << " j " << j << " k " << k << " value: " 
                    << temp1[(i * 3 * 2) + (j * 3) + k] << endl;
}

输出:

i 0 j 0 value: 2
i 0 j 1 value: 4
i 1 j 0 value: 1
i 1 j 1 value: 3

i 0 j 0 k 0 value: 101
i 0 j 0 k 1 value: 102
i 0 j 0 k 2 value: 103
i 0 j 1 k 0 value: 104
i 0 j 1 k 1 value: 105
i 0 j 1 k 2 value: 106
i 1 j 0 k 0 value: 107
i 1 j 0 k 1 value: 108
i 1 j 0 k 2 value: 109
i 1 j 1 k 0 value: 110
i 1 j 1 k 1 value: 111
i 1 j 1 k 2 value: 112
i 2 j 0 k 0 value: 113
i 2 j 0 k 1 value: 114
i 2 j 0 k 2 value: 115
i 2 j 1 k 0 value: 116
i 2 j 1 k 1 value: 117
i 2 j 1 k 2 value: 118

【讨论】:

  • 我对您引用的链接有疑问。所以,我们不能真正将int** 用于二维数组,而是使用我上面提到的单个指针?
【解决方案2】:

标准清楚明确地表明答案是肯定的。参见 n3797 s8.3.4。有些语言很难阅读,但最后的注释说:

[注意:C++ 中的数组是按行存储的(最后一个下标变化最快),声明中的第一个下标有助于确定数组消耗的存储量,但在其中没有其他作用下标计算。 ——尾注]

因此,您可以通过使用简单指针算法的计算来引用任何数组中的存储空间,并且只需通过递增指针来迭代任何数组中的所有存储空间。

请注意,数组不需要打包。通常是这样,但元素之间可能会插入填充(但不会在行或列之间插入额外的填充)。

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多