2

我只是有一个关于指针数组的基本问题。

int *Arr[8]; // An array of int pointers

int (*Arr)[8]; // A pointer pointing to an int array

如果我使用第二个,如何将整数分配给数组?我知道如果在堆上

int *Arr = new int[8]

我能做到Arr[5] = 99。我如何在木桩上做到这一点?

非常感谢您的帮助。

4

2 回答 2

7

鉴于此声明:

int (*Arr)[8];

您可以为其分配int大小为 8 的数组的地址:

int data[8];
Arr = &data;

您可以data通过以下方式进行修改Arr

(*Arr)[i] = value;

注意周围的括号*Arr。他们需要在应用索引Arr 之前取消引用,因为索引[]运算符具有更高的优先级。

这里要理解的重要一点是它data不是动态分配的。如果你在它超出范围后保留它的地址,你会得到一个悬空指针(一个指向不再存在的东西的指针。)

要动态分配数组并将其分配给Arr,您可以对结果使用类型转换,new如下所示:

int (*Arr)[8] = reinterpret_cast<int(*)[8]>(new int[8]);

(可以在ideone上找到一个工作示例。)

当然,以这种迂回的方式执行此操作没有多大意义,因为您可以:

int* Arr = new int[8];

当然,您可以改用std::vector并完全避免手动内存管理:

std::vector<int> Arr;

它为您提供了一个根据需要自行增长的数组。

于 2013-07-27T20:41:48.753 回答
2

由于您使用的是 C++,是否有任何理由说明容器std::array不适用?例如:

std::array<int, 8> arr;
std::array<int, 8>* arr_p = &arr;

如果您直到运行时才知道大小,您可以使用std::vector

std::vector<int> vec(8);

您拥有的代码是正确的,但鉴于标准库可用,大多数人可能会建议使用容器和算法,而不是自己手动管理内存,这很容易出现错误和内存泄漏,尤其是在涉及异常时。

于 2013-07-27T20:41:45.933 回答