C++ c++;二维数组定义

C++ c++;二维数组定义,c++,C++,下面是怎么回事 int data[2][2] = { {1,1}, {2,2}}; int sum = sum(data, 2); 总和定义为 int sum(int **data, int rows); 数据包含数据[0]的地址,因此可以将其视为指针。*数据引导我找到值,它是另一个类型为int的数组。另一个数组应被视为指向第一个元素的指针。因此,为什么编译器在int**数据的参数处抱怨 我得到一个编译器错误,如下所示。我理解这个错误,但我的问题是为什么**数据是不可接受的 error: c

下面是怎么回事

int data[2][2] = { {1,1}, {2,2}};
int sum = sum(data, 2);
总和定义为

int sum(int **data, int rows);
数据包含
数据[0]
的地址,因此可以将其视为指针。
*数据
引导我找到值,它是另一个类型为
int
的数组。另一个数组应被视为指向第一个元素的指针。因此,为什么编译器在int
**数据的参数处抱怨

我得到一个编译器错误,如下所示。我理解这个错误,但我的问题是为什么
**数据
是不可接受的

error: cannot convert int (*)[2] to int** for argument 1 to int sum(int**, int)

您应该在参数定义中包含数组的大小

    int sum(int data[2][2], int rows);

注意:如果是动态数组,那么您之前所做的是正确的。

您应该在参数定义中包含数组的大小

    int sum(int data[2][2], int rows);

注意:如果它是一个动态数组,那么您之前所做的是正确的。

int**data
是指向
int
的指针

向第一个参数传递数据实际上只是向它传递一个
int*
,这与
int**
不同

此外,一旦进入
sum()
,它就不知道
int**data
指向二维数组,它只知道它是指向
int
的指针

第一次取消引用数据时,会给您一个指向
int
的指针。 第二次取消对数据的引用将为您提供
int


您需要将接口更改为
sum()
函数。

int**data
是指向
int
的指针

向第一个参数传递数据实际上只是向它传递一个
int*
,这与
int**
不同

此外,一旦进入
sum()
,它就不知道
int**data
指向二维数组,它只知道它是指向
int
的指针

第一次取消引用数据时,会给您一个指向
int
的指针。 第二次取消对数据的引用将为您提供
int


您需要将接口更改为
sum()
函数。

无论数组是一维还是多维,它都只能转换为指向第一个元素的指针,而不能转换为指向指针数组的指针

要了解原因,请分析阵列在内存中的布局方式

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\u memory+i*H+j)
)。指向指针的指针的结构与数组完全不同;索引它在语法上看起来是一样的,但它会导致完全不同的事情发生(
ppi[i][j]
变成
*(*(ppi+i)+j)

无论数组是一维还是多维,它都只能转换为指向第一个元素的指针,而不能转换为指向指针数组的指针

要了解原因,请分析阵列在内存中的布局方式

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\u memory+i*H+j)
)。指向指针的指针的结构与数组完全不同;索引它在语法上看起来相同,但会导致完全不同的事情发生(
ppi[i][j]
变成
*(*(ppi+i)+j)

int data[2][2]//它基本上是4个值的数组。它不是数组的数组。
维度只是解释编译器如何访问值

假设你有:

data[R][C]  
data[X][Y] == *(&data)[X*C + Y]  
按照此说明,您应该定义您的函数:

int sum(int *data, int rows);

如果你想展示它的功能,我可以帮助你正确使用它。

int data[2][2]//它基本上是4个值的数组。它不是数组的数组。
维度只是解释编译器如何访问值

假设你有:

data[R][C]  
data[X][Y] == *(&data)[X*C + Y]  
按照此说明,您应该定义您的函数:

int sum(int *data, 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和(int*i,int行){
cout这可能有帮助:

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和(int*i,int行){

cout数组名到指针的衰减只发生一次,因此得到的是指针,而不是指针到指针

C/C++数组是数据元素的连续分配。数组数组仍然是元素的连续分配——只是元素更大。这就是错误消息“
无法将int(*)[2]转换为int**
”的意思

另一种方法是:双解引用只有在指向某个地方的指针数组时才起作用。然而,C/C++不能为您这样做;您需要自己分配和填充一个


int(*)[2]
类型允许您以
data[i][j]
的形式访问数组。如果您希望以这种方式访问数组,则需要将该类型传播到所有使用的地方。

数组名到指针衰减只发生一次,因此您得到的是指针,而不是指针到指针

C/C++数组是数据元素的连续分配。数组数组仍然是元素的连续分配——只是元素更大。这就是错误消息“
无法将int(*)[2]转换为int(*)的原因