Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ can';t找出int[3][3]和int(*const)[3]之间的差异_C++_Arrays_Templates_Pointers_G++ - Fatal编程技术网

C++ can';t找出int[3][3]和int(*const)[3]之间的差异

C++ can';t找出int[3][3]和int(*const)[3]之间的差异,c++,arrays,templates,pointers,g++,C++,Arrays,Templates,Pointers,G++,我有以下代码: int board[3][3]; // I am ommiting initialization code for board here so as not to clutter it. typedef std::vector<std::pair<int [3][3], int> > History; History hist = History(); const std::pair<int[3][3], int> p = std

我有以下代码:

int board[3][3];        // I am ommiting initialization code for board here so as not to clutter it.
typedef std::vector<std::pair<int [3][3], int> > History;
History hist = History();
const std::pair<int[3][3], int> p = std::make_pair(board, cell);
hist.push_back(p);
int-board[3][3];//我在这里输入主板的初始化代码,这样就不会把它弄得乱七八糟了。
typedef std::向量历史;
历史记录=历史();
const std::pair p=std::make_pair(板、单元);
历史推回(p);
但是用g++编译它会给我带来一个我无法理解的错误:

In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0,
                 from /usr/include/c++/4.7/vector:61,
                 from performancesystem.h:29:
/usr/include/c++/4.7/bits/stl_pair.h: In instantiation of
    ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = 
    int (*)[3]; _U2 = int; _T1 = int [3][3]; _T2 = int]’:
Test.cpp:74:65:   required from here
/usr/include/c++/4.7/bits/stl_pair.h:111:39: error: incompatible types in
    assignment of ‘int (* const)[3]’ to ‘int [3][3]’
在/usr/include/c++/4.7/bits/stl_algobase.h:65:0中包含的文件中,
从/usr/include/c++/4.7/vector:61,
来自performancesystem。h:29:
/usr/include/c++/4.7/bits/stl_pair.h:在
'std::pair::pair(const std::pair&)[带_U1=
int(*)[3];2=int;T1=int[3][3];T2=int]:
测试。cpp:74:65:从此处开始需要
/usr/include/c++/4.7/bits/stl_pair.h:111:39:错误:中的类型不兼容
将“int(*const)[3]”赋值为“int[3][3]”

我总是遇到这个问题,理解C++中指针和数组之间的区别。他们不应该是同一件事吗?有人能帮我吗?

在某些情况下,数组可以转换为指针。从来没有任何转换的另一种方式,这是你正在尝试的

要向前推进,您应该停止直接使用数组。它们在C++中是相当没有用处的。我会写一个新类(或者结构,如果你愿意的话)

课程板
{
...
私人:
int sq[3][3];
};
typedef std::向量历史;

这样,您将停止使用无用的数组,并且不会对数组和指针产生混淆。

在某些情况下,数组可以转换为指针。从来没有任何转换的另一种方式,这是你正在尝试的

要向前推进,您应该停止直接使用数组。它们在C++中是相当没有用处的。我会写一个新类(或者结构,如果你愿意的话)

课程板
{
...
私人:
int sq[3][3];
};
typedef std::向量历史;

这样,您将停止使用无用的数组,并且不会对数组和指针产生混淆。

您的情况中的问题不是数组指针差异(很大)


问题是数组不能在赋值中按值复制。将C数组封装在类中可以解决这个问题,或者更好——使用标准数组。

在您的情况下,问题不在于数组指针的差异(很大)


问题是数组不能在赋值中按值复制。将C数组封装在类中可以解决这个问题,或者更好——使用标准数组。

不能怪你,因为数组和指针的区别通常只在动态大小的结构中实现

例如,数组int a[3][4][5][6]是从内存中线性分配的。它包含3*4*5*6个单位,其中[2][3][4][0]。。。[2][3][4][5]在6个连续指数中,其中[0][1][n][5]各相隔6个元素,而[1][n][3][6]各相隔5*6个元素,依此类推

然而,指针提供了“间接性”。 多维数组可以通过第一级数组a[3]提供指向下一级数组b[4]、c[4]和d[4]的3个指针(间接),每个指针都提供指向下一级的间接,依此类推

在许多实际应用程序(例如,字符串指针表)中,人们确实看不到区别,因为语法隐藏了细节:


intmain(intac,char**av){
//可以通过
av[2][2]
获得第三个字符串的第三个字符,即使原型可以用
intmain(intac,char*av[]);
表示,但不能用
intmain(intac,char av[])表示
因为表av的维度不可能由该语法确定。

不能怪你,因为数组和指针的区别通常只在动态大小的结构中实现

例如,int a[3][4][5][6]数组是从内存中线性分配的。它包含3*4*5*6个单元,其中a[2][3][4][0]…a[2][3][4][5]在6个连续索引中,a[0][1][n][5]各相隔6个元素,a[1][n][3][6]各相隔5*6个元素,以此类推

然而,指针提供了“间接性”。 多维数组可以通过第一级数组a[3]提供指向下一级数组b[4]、c[4]和d[4]的3个指针(间接),每个指针都提供指向下一级的间接,依此类推

在许多实际应用程序(例如,字符串指针表)中,人们确实看不到区别,因为语法隐藏了细节:


intmain(intac,char**av){
//可以通过
av[2][2]
获得第三个字符串的第三个字符,即使原型可以用
intmain(intac,char*av[]);
表示,但不能用
intmain(intac,char av[])表示< /代码>不能从该语法中确定表AV的维数。

< P>问题的根源是C和C++处理多维数组的方式。当涉及到<代码> const 时,问题放大了。
std::pair
是一对值,第二个值是
int
,第一个值是指向
int[3]数组的指针
。第一个元素有很多问题。一个原因是它是指针。另一个原因是
const
对多维数组做了奇怪的事情。这就是您遇到的问题

您需要的是一个3x3数组作为对象。因此--将其设为对象:

struct Board {
   int arr[3][3];
};

现在你的对变成了
std::pair
,你的向量a
std::vector
。你现在可以安全地用局部变量构建一个
Board
int
对,因为
Board
被复制了。你不能用原始的C多维数组安全地这样做,因为第一个元素本来就是指针。

问题的根源是C和C++处理多维数组的方式,当涉及到代码> const 时,问题放大了。 那
std::pairstruct Board {
   int arr[3][3];
};