C++ 二维数组定义
c++ two dimensional array definition
下面有什么问题
int data[2][2] = { {1,1}, {2,2}};
int sum = sum(data, 2);
总和定义为
int sum(int **data, int rows);
data 包含data[0]
的地址,因此可以将其视为指针。*data
将我引向值,这是另一个类型 int
的数组。另一个数组应被视为指向第一个元素的指针。因此,为什么编译器抱怨int **data
的参数?
我收到一个编译器错误,如下所示。我理解这个错误,但我的问题是为什么**data
是不可接受的。
error: cannot convert int (*)[2] to int** for argument 1 to int sum(int**, int)
无论数组是一维的还是多维的,它都只能转换为指向第一个元素的指针,而不能转换为指向指针数组的指针。
要了解原因,请分析数组在内存中的布局方式。
int data[3]
0.......4.......8...... (assume sizeof(int)==4)
data[0] data[1] data[2]
^ &data[0]
int data[3][2]
0..........4..........8..........12.........16.........20........
data[0][0] data[0][1] data[1][0] data[1][1] data[2][0] data[2][1]
^ &data[0][0]
所有元素总是线性布局的,因此每个数组(一维或多维(都可以表示为指向第一个元素(arr[0][0]...[0]
(的指针,并且仅如此。多维数组不能表示为指向指针数组的指针,因为这些指针数组在任何地方都不存在。
维度只是编译时转换为地址的提示(arr[i][j]
变成*(array_memory + i*H + j)
(。指针到指针的结构与数组完全不同;索引它在语法上看起来是一样的,但它会导致完全不同的事情发生(ppi[i][j]
变得*(*(ppi + i) + j)
。
您应该在参数的定义中包含数组的大小。
int sum(int data[2][2], int rows);
注意:如果它是一个动态数组,那么您之前所做的是正确的。
这可能有帮助:
int sum(int *i, int rows) {
cout << *i << *(i+1) << *(i+2) << *(i+3);
return 0;
}
int main() {
int data[2][2] = { {1,1}, {2,2}};
int sum1 = sum(data[0], 2);
return 0;
}
int data[2][2]//它基本上是 4 个值的数组。 它不是数组的数组。
Dimentionals只是解释编译器如何访问值。
假设您有:
data[R][C]
data[X][Y] == *(&data)[X*C + Y]
按照此说明,您应该定义函数:
int sum(int *data, int rows);
如果你想展示它的作用,我可以帮助你正确使用它。
数组名称到指针的衰减只发生一次,所以你会得到一个指针,而不是一个指针到一个指针。
C/C++ 数组是数据元素的连续分配。 数组仍然是元素的连续分配 - 只是元素更大。 这就是您的错误消息" cannot convert int (*)[2] to int**
"所说的。
另一种看待它的方式:双反引用仅在指向某处的指针数组时才有效。 但是,C/C++ 不会为您执行此操作;您需要自己分配和填充一个。
int (*)[2]
类型允许您以data[i][j]
访问数组的数组。 如果要以这种方式访问数组,则需要将该类型传播到使用它的所有位置。
int ** data
是指向int
的指针。
将数据传递给求和第一个参数实际上只是向其传递int*
,这与int **
不同。
此外,一旦你进入sum()
,它就不知道int **data
指向二维数组,它只知道它是一个指向int
的指针......
第一次取消引用数据会为您提供指向int
的指针。第二次取消引用数据会给您带来int
。
您需要将接口更改为sum()
函数。
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 如何在 Visual Studio C++ 11 中运行时定义二维数组?
- 使用二维数组作为一维数组是否正确?可能会导致未定义的行为左右?
- 二维数组传入没有全局定义 (M x N) 的函数
- 具有未定义的第二维的二维数组
- 用C++MATLAB API定义二维数组
- C++ 二维数组定义
- 在C++中定义二维数组
- 二维数组定义
- 定义boost::dynamic_bitset的(一/二)维数组