在C ++中初始化指向数组的指针的正确方法?

时间:2015-09-27 17:30:43

标签: c++ arrays

考虑代码:

const int MAX = 3;
int (*array)[MAX]  ;

int intArray[3] = {30 , 40 , 50};

array = &intArray;
for (int h = 0 ; h < MAX ; h++)
{
    std::cout << *(array[h]) << std::endl;
}

输出结果为:

30
0
3

显然,数组初始化有问题,为什么我会这样做 30 , 0 , 3而非30,40,50

4 个答案:

答案 0 :(得分:5)

就像那样:

const int MAX = 3;
int *array;

int intArray[3] = {30 , 40 , 50};

array = intArray;
for (int h = 0 ; h < MAX ; h++)
{
    std::cout << array[h] << std::endl;
}

答案 1 :(得分:2)

在C ++中处理内置数组是非常奇怪的,特别是在考虑指针时。指针可以看作是两件事之一:

  • 作为指向单个对象的指针
  • 作为指向数组第一个元素的指针

那么这是如何工作的?好吧,让我们从数组的定义开始,让我们按照通常在C ++中完成的方式定义一个指向数组的指针:

const int MAX = 3;
int *array;                           // (1)

int intArray[3] = {30 , 40 , 50};

array = intArray;                     // (2)
for (int h = 0 ; h < MAX ; h++)
{
  std::cout << array[h] << std::endl; // (3)
}

现在发生了什么?

在第(1)行,我们定义了一个指向int的指针array。注意:不是指向int数组的指针,而是指向普通int的指针。

在第(2)行,我们将intArray分配给该指针。现在intArray是一个数组,那么我们如何将它分配给指针呢?好吧,这就是魔术:如果在rvalue上下文中使用数组(即,在需要值的上下文中),则编译器实际上提供指向第一个元素的指针。也就是说,该行完全等同于

array = &(intArray[0]);

现在在第(3)行中,我们访问了array[h]。也就是说,我们访问指针就像它是一个数组一样。那么这里发生了什么?好吧,指针被解释为指向数组的第一个元素,并且访问该数组的元素h实际发生的是编译器将array[h]替换为*(array + h)。也就是说,它取消引用h int晚于array的指针。

好的,你的定义是什么

int (*array)[MAX];

做什么?好吧,正如前面的声明定义了一个指向int的指针,这定义了一个指向MAX int s数组的指针,即指向int[MAX]的指针。和以前一样,这可以指向三个int s的单个数组,也可以指向此类数组的数组。

现在你做了

array = &intArray;

您将其设置为指向单个数组intArray

现在在您的输出行中写道:

*(array[h])

那么这里发生了什么?好吧,在括号中你有array[h],也就是说,你在指针[]上使用了数组下标运算符array。因此,编译器将访问三个int数组数组中的三个整数h数组。现在你只有一个整数数组,所以只要h > 0你就会出界。绝对没有办法预测你会到达的数字(你的程序也可能已经崩溃)。

但是我们尚未完成:您的完整表达式会显示*(array[h]),因此您实际取消引用array[h]的结果。但是array[h]的结果是3个int的数组!好吧,dereference运算符需要一个指针 value ,因此数组再次“衰减”到指向其第一个元素的指针,当然可以取消引用,给出数组的第一个元素。实际上,您可以将*(array[h])等同地写为array[h][0]

这也是此类变量的用例:通常使用形式的变量

int intArray[3][3] = {{30, 40, 50}, {300, 400, 500}, {3000, 4000, 5000}};

您将使用array = intArray初始化指针,然后输出

30
300
3000

好的,但是如何只用三个值来访问intArray的值?好吧,为此你必须首先取消引用指针才能到达数组,然后访问数组索引运算符:

std::cout << (*array)[h] << std::endl;

或者你可以看到它是1×3数组的第一行(也是唯一的),并且等效地写

std::cout << array[0][h] << std::endl;

答案 2 :(得分:1)

int (*array)[MAX]  ;

该行声明array作为MAX整数数组的指针。 因此,如果您想使用intArray打印array,则可以执行此类操作

for (int h = 0; h < MAX; h++)
    {
        std::cout << (*array)[h] << std::endl;
    }

答案 3 :(得分:0)

您应该使用(*array)[h]array是指向intArray的指针,您应该先取消引用它。

因为有人认为array是完全错误的数组类型。你可以用程序验证

#include <type_traits>
#include <iostream>
using namespace std;
int main() {
  cout << is_array<int*[3]>::value << endl;
  cout << is_array<int(*)[3]>::value << endl;
  return 0;
}