我只是有一个关于指针数组的基本问题。
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
。我如何在木桩上做到这一点?
非常感谢您的帮助。
鉴于此声明:
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;
它为您提供了一个根据需要自行增长的数组。
由于您使用的是 C++,是否有任何理由说明容器std::array
不适用?例如:
std::array<int, 8> arr;
std::array<int, 8>* arr_p = &arr;
如果您直到运行时才知道大小,您可以使用std::vector
:
std::vector<int> vec(8);
您拥有的代码是正确的,但鉴于标准库可用,大多数人可能会建议使用容器和算法,而不是自己手动管理内存,这很容易出现错误和内存泄漏,尤其是在涉及异常时。