创建一个指向T类数组的指针数组

时间:2014-02-20 17:27:49

标签: c++ arrays pointers dynamic multidimensional-array

我正在尝试使用动态数组创建自己的表类,而不使用向量。我明白了

T** values = new T* [rows];

创建一个指针数组或指针指针。我不知道如何为每个指针初始化一个新数组。我最初认为它应该是

for (int x = 0; x < rows; x++)
    values[x] = new T [columns];

但它也看起来不对,因为我没有在该代码中使用任何星号。所以我再次考虑它,现在我想我可能不得不使用一个新的指针迭代数组中的指针。我不知道它的代码。我想说它是

T* pointer;
for (pointer = values; pointer < values+rows; pointer++)
    *pointer = new T [columns];

我也不知道如何在被指向的数组中设置值。我认为*值指向指针数组,**指针指向值数组。我不知道如何指定我想要的数组..它是否只是**值[0] [0] = T来设置第一个指针所指向的数组的第一个值内的值? / p>

2 个答案:

答案 0 :(得分:1)

正如Mike Seymour在评论中所述,您的解除引用星号隐藏在operator[]下方,代码

values[x]     = new T [n];

相当于

*(values + x) = new T [n];

因此,要访问一个元素,您不需要再次取消引用:

**values[0][0] = T

但只是

  values[0][0] = T

另外考虑一下设计,你甚至不需要一个数组数组,但只需要一个数组:

T* values = new T [columns * rows];

您只需通过计算索引即可访问,例如:

values[y * rows + x]

值得一提的是,即使出于学习目的,也最好在那里使用std::vector。如果您完全倾向于自己的解决方案,请编写自己的动态数组类(具有RAII惯用语)。具有原始operator new和原始指针的表类将是non-excepton safe并且容易出现泄漏,或者将包含动态数组类的某些部分(duplication of code)和违反{{ 3}})。

答案 1 :(得分:0)

此代码

T** values = new T* [rows];

for (int x = 0; x < rows; x++)
    values[x] = new T [columns];

有效

如果要使用第二条记录,则代码将显示为

T** values = new T* [rows];

for ( T **ptr = values; ptr != values + rows; ++ptr )
    *ptr = new T [columns];

values[0]相当于*values

要初始化值,您应该使用两个循环(尽管您只能使用一个循环,但代码的可读性会降低)

for ( int i = 0; i < rows; i++ )
{
   for ( int j = 0; j < columnds; j++ ) values[i][j] = SomeValue;
}