考虑代码:
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
?
答案 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;
}