我对指针的基本用法有两个疑问。
使用以下代码
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::array
、boost::array
或std::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>>();