在C ++中声明一个指针数组

时间:2015-01-22 20:19:23

标签: c++

当我创建一个整数指针数组时,我尝试了这个。

int *arr = new int*[10];

这不起作用,但以下工作。

int **arr = new int*[10];

为什么我们需要双指针?当我尊重它时,我必须做以下事情。

cout<<arr[0];

为什么我们不需要*在arr前? 谢谢!

3 个答案:

答案 0 :(得分:3)

new int*[10]分配一个由十个指针组成的数组,它产生一个指向该数组第一个元素的指针。元素类型本身就是一个指针,这就是为什么你最终得到一个指向指针(int)的指针,即int**。显然int**无法转换为int*,因此您必须使用适当的类型声明arr

答案 1 :(得分:1)

你不只是“制作一个整数指针数组”:你动态分配它们

就像动态分配整数数组一样,你会得到一个指针来访问它们:

int* ptr = new int[5];

当你动态分配一个指向整数的指针数组时,你会得到一个指针来访问它们;由于您的元素类型为int*,因此添加额外的*会为您提供int**

int** ptr = new int*[5];

至于解除引用,我不太清楚你在问什么,但这就是[]运算符的工作原理;它将n添加到指针然后取消引用它:

int* ptr = new int[5];
*(ptr+1) = 42;         // identical
  ptr[1] = 42;         // to this

如果你忘了动态分配,只做一个很好的数组,那就简单了:

int* array[5];
std::cout << array[0];

答案 2 :(得分:0)

此语句是int

的1D数组的表达式
int* arr = new int [10]; // pointer to array of 10 int

此语句是int

的2D数组的表达式
int** arr = new int* [10]; // pointer to 10 pointers to arrays of 10 int

要填充1D数组,您需要执行此操作...

for (int i = 0; i < 10; i++) {
        arr[i] = val; // where val can be any integer
}

要填充2D数组,您需要执行此操作...

int** arr2 = new int*[10];
for (int i = 0; i < 10; i++) {
    arr2[i] = new int[10];
    for (int j = 0; j < 10; j++) {
        arr2[i][j] = val; // where val can be any integer
    }
}

变量类型和变量名称之间的*符号是指针的语法。它将类型从 int 更改为int 的指针。