分配指向固定大小数组的指针



我对指针的基本用法有两个疑问。

使用以下代码

 int (*p_b)[10];
 p_b = new int[3][10];
 // ..do my stuff
 delete [] p_b

p_b指向一个包含3个元素的数组,每个元素的固定长度为10 int。

Q1:

如果我想让每个元素都是指向固定数组大小的指针,如何声明p_b ?基本上我想要下面的

  p_b[0] = pointer to a fixed-array size of 10
  p_b[1] = pointer to a fixed-array size of 10
  // ... and so on

我在想int (** p_b)[10],但我不知道如何使用新的分配它?我想避免回到更一般的int** p_b

Q2:

是根据我的原始代码示例上面,如何调用新的,以便p_b指向一个唯一的固定大小的10 int数组,而不是调用p_b = new int[1][10] ?为了释放内存,我必须调用delete[],而我找不到一个表达式,我只能简单地调用delete

p_b指向一个包含3个元素的数组,每个元素的固定长度为10 int.

如何声明p_b,如果我想让每个元素是一个指向固定数组大小的指针?

你的第一句话没有完全涵盖这个问题吗?

是根据我上面的原始代码示例,如何调用new,以便p_b指向一个唯一的固定大小的10 int数组,而不是调用p_b = new int[1][10] ?为了释放内存,我必须调用delete[],而我找不到一个表达式,我只能简单地调用delete。

我完全不明白为什么这是一个问题,但是你可以通过将数组包装在另一个类型…例如std::arrayboost::arraystd::vector

首先,如果您的new表达式有方括号(new somtype[somesize]),那么您的delete也必须有方括号(delete [] your_pointer)。

第二,现在您已经将p_b定义为指向某些数据的单个指针。如果您真正想要的是指针数组,那么您需要将其定义为数组。由于显然需要三个独立的数组,因此必须分别分配每个数组。如果从typepedef:

开始,可能会更简单
typedef int *p_int;
p_int p_b[3];

然后分配三个数组:

for (int i=0; i<3; i++)
    p_b[i] = new int[10];

要删除这些,您需要分别删除每一个:

for (int i=0; i<3; i++)
    delete [] p_b[i];

我绝对同意@Tomalak的观点,你几乎不应该自己搞砸这样的事情。不清楚您真正想要完成的是什么,但仍然很容易猜测,无论如何,标准容器很可能是一种更简单、更干净的方法。

下面是如何实现Q1的示例:

int main()
{
    typedef int foo[10];
    foo* f = new foo[3];
    f[0][5] = 5;
    f[2][7] = 10;
    delete [] f;
}

对于Q2,删除new[]分配的内存的唯一方法是delete[]。如果你个人不想写delete[],你可以使用vector或其他STL容器。真的,除非这是一些核心的超级优化,否则你应该使用向量。除非迫不得已,不要手动管理内存。

要使用一个原始指针来管理一个二维数组,你必须首先创建一个指向数组元素类型的指针的指针,该指针将指向数组的每一行。接下来,必须将每个行指针赋值给该行的实际数组元素。

int main()
{
  int **p;
  // declare an array of 3 pointers
  p = new int*[3];
  // declare an array of 10 ints pointed to by each pointer
  for( int i = 0; i < 3; ++i ) {
    p[i] = new int[10];
  }
  // use array as p[i][j]
  // delete each array of ints
  for( int i = 0; i < 3; ++i ) {
    delete[] p[i];
  }
  // delete array of pointers
  delete[] p;
}

一个更简单的解决方案是使用std::array。如果你的编译器不提供这个类,你也可以使用std::vector

std::array<std::array<int,10>,3> myArr; 
myArr[0][0] = 1;

对于Q1,我认为您需要

int (*p[3])[10];

不确定的时候试试cdecl

你的另一个问题似乎已经被其他答案很好地回答了。

问候,Yati Sagade

事实上,还没有人对你的问题给出确切的答案。

不是

int (*p_arr)[10] = new int[3][10];
// use, then don't forget to delete[]
delete[] p_arr;

我建议使用

std::vector<std::array<int, 10>> vec_of_arr(3);

或者如果你不需要移动它,也不需要运行时长度:

std::array<std::array<int, 10>, 3> arr_of_arr;

Q1

如果我想让每个元素都是指向固定数组大小的指针,如何声明p_b ?

int(**pp_arr)[10] = new std::add_pointer_t<int[10]>[3];
for (int i = 0; i < 3; ++i)
    pp_arr[i] = new int[1][10];
// use, then don't forget to delete[]
for (int i = 0; i < 3; ++i)
    delete[] pp_arr[i];
delete[] pp_arr;

该代码的现代变体是

std::vector<std::unique_ptr<std::array<int, 10>>> vec_of_p_arr(3);
for (auto& p_arr : vec_of_p_arr)
    p_arr = std::make_unique<std::array<int, 10>>();

或者如果你不需要移动它,也不需要运行时长度:

std::array<std::unique_ptr<std::array<int, 10>>, 3> arr_of_p_arr;
for (auto& p_arr : arr_of_p_arr)
    p_arr = std::make_unique<std::array<int, 10>>();

Q2

是否根据我上面的原始代码示例,如何调用new以便p_b指向一个唯一的固定大小的10 int数组,而不是调用p_b = new int[1][10] ?

必须将数组包装成另一种类型。

std::array<int, 10>* p_arr = new std::array<int, 10>;
// use, then don't forget to delete
delete p_arr;

你可以用你喜欢的数组包装类型替换std::array<int, 10>,但是你不能用固定大小的数组别名替换它。该代码的现代变体是:

auto p_arr = std::make_unique<std::array<int, 10>>();

相关内容

  • 没有找到相关文章

最新更新