无法弄清楚 int[3][3] 和 int(* const)[3] 之间的区别
can't figure out difference between int[3][3] and int(* const)[3]
我有此代码:
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);
但是用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]’
我总是遇到这个问题,了解C 中指针和数组之间的差异。他们不应该是同一件事吗?谁能帮我吗?
您的情况下的问题不是数组销差差异(这很大)。
问题在于,分配中的数组不能在分配中得到值。将C阵列包装在类中可以解决或更好 - 使用标准数组。
不能怪您,因为数组与指针的差异通常仅在动态尺寸的结构中实现。
阵列int a [3] [4] [5] [6]例如是从内存线性分配的。它包含3*4*5*6个单位,其中a [2] [3] [4] [0] ... a [2] [3] [4] [5]连续6个索引,其中a [0] [1] [1] [n] [5]每个6个元素,其中一个[1] [n] [3] [6]分开5*6个元素,等等。
指针提供了"间接"。可以通过first_level数组A [3]实现多维数组,从而提供3个指示器(间接指示)到下一个级别阵列B [4],C [4]和D [4],每个级别提供了下一个级别的间接性,等等。
在许多现实生活中的应用中(例如,指向字符串的指针),人们真的看不到差异,因为语法隐藏了细节:
int main(int ac, char **av) {
//一个人可以用 av[2][2]
获得第三个字符串的第三个字符,即使可以用 int main(int ac, char *av[]);
表示原型,但不能用 int main(int ac, char av[][]);
表示,因为表AV的尺寸无法从该语法中确定。
在某些情况下,可以将其转换为指针。从来没有任何转换是您正在尝试的。
要前进,您应该停止直接使用数组。它们在C 中相当无用。我会写一个新类(如果愿意的话,或者结构)
class Board
{
...
private:
int sq[3][3];
};
typedef std::vector<std::pair<Board, int> > History;
这样,您将停止使用无用的数组,而您不会对数组和指针感到困惑。
问题的根源是C和C 处理多维数组的方式。涉及const
时的问题会放大。
std::pair<int [3][3], int>
是一对值,第二个是int
,第一个是int[3]
数组的指针。由于多种原因,第一个元素是有问题的。一个是这是指针。另一个是const
对多维阵列做奇怪的事情。那是您遇到的问题。
您想要的是一个3x3数组作为对象。所以 - 使其成为对象:
struct Board {
int arr[3][3];
};
现在,您的对变为std::pair<Board,int>
,您的向量A std::vector<std::pair<Board, int> >
。现在,您可以安全地构造Board
,int
对局部变量,因为Board
已复制。您无法使用RAW C多维数组安全地执行此操作,因为第一个元素将是指针。
您的board
定义了常数指针。int (* const)[3]
实际上与int[n][3]
变量相同:只是一个指向3个整数的指针(尽管第一个是常数)!
您有三个选择:
- 在模板中定义 t1 为
int (*const)[3]
- 将您的
board
定义为动态分配的数组。(使用int (*board)[3] = new int[3][3];
) -
危险: const_cast&lt;>您的
board
到非const变量。(最好不要这样做:D)
lg ntor
ps:但是,我还建议为此写一堂课,并超载[] - 操作员。更多的最新状态;)
- int x 和 int x=0 之间的差异在C++
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 使用模板在size_t和int之间进行隐式类型转换
- 在 ENG US 和 ENG INT 之间切换时,GetKeyboardLayout() 不会改变
- 使用 double 在 C++ 中初始化 int 之间的差异
- C :使用函数过载与CHAR到INT之间的隐式转换,反之亦然
- 为什么字符串和 int 之间的 + 运算符充当 substr
- int f(int *i) 和 int f(int &i) 之间的区别
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- 在“有符号的 int”和“无符号的 int”之间进行添加
- 一个关于C++中double和int之间转换的奇怪结果
- 向量 <int> V[] 和向量<向量<int> > V 之间的区别
- map< "string" ,..> 和 map<int,..> 之间的性能差异?
- int p = *(int *)i 和 int p = *(int *)&i 之间的区别
- int x{} 之间有区别吗?和整数 x = 0;
- int[n][n] 和 int** 之间的关系
- C++字符和 int 之间的转换,结果错误
- void(int) 和 void (*)(int) 之间的区别
- int someInts[3]和int*someInts=new int[3]之间的差异