传递二维数组时出现问题

Issue in Passing a 2-D array

本文关键字:问题 二维数组      更新时间:2023-10-16

我阅读了如何在函数中将二维数组作为参数传递,并尝试实现相同的方法。我遇到了两个问题:

1(代码输出的第一行包含垃圾值。 2( 这条线((arr + in( + j(实际上做了什么?我的意思是,为什么我们不能做类似((arr + i( + j( 来访问 arr[i][j] ?

我还尝试使用参数 int **arr 传递矩阵,然后尝试将值打印为 arr[i][j],但没有输出。

这是我得到的输出:-

Enter number of nodes: 4
0167772161878012032-1
0000
0000
0000

这是我的代码:-

#include <iostream>
using namespace std;
void show(int* arr, int n)
{
int i, j;
for(i = 0; i < n; ++i)
{
for(j = 0; j < n; ++j)
{
cout << *((arr + i*n) + j);
}
cout << endl;
}
}
int main()
{
int n, i, j;
cout << "Enter number of nodes: ";
cin >> n;
int arr[n][n] = {{0}}; //Will initialize all elements in the matrix with 0.
show((int*)arr, n);
}

这里最大的问题是你使用的是C而不是C++。

为了避免人们喘不过气来开始宗教或政治讨论,让我们把它归结为:

VLA(可变长度数组(不允许在C++中使用。

此外,切勿将原始指针用于拥有的内存,也不应使用平特算术。

然后是主要话题:

传递二维数组时出现问题

用于传递数组以运行函数的语法是错误的。在C++数组可以通过引用或指针传递。请看:

void function1(int(&m)[3][4])   // For passing array by reference
{}
void function2(int(*m)[3][4])   // For passing array by pointer
{}
int main()
{
int matrix[3][4]; // Define 2 dimensional array
function1(matrix);  // Call by reference
function2(&matrix); // Call via pointer 
return 0;
}

当然,我们可以使用指针进行各种肮脏的设计。即使接受指针也会衰减。但我们不应该这样做。

可变长度数组不是标准的C++功能。

不过,您还是向函数传递了一个指向二维数组第一个元素的指针。

二维数组的每个"行"都有 n 个元素。因此,如果你有一个指向第一行的第一个元素的指针,那么要获得指向第二行的第一个元素的指针,你必须写

arr + n

如果你想得到指向二维数组第 i 行的第一个指针,你必须写

arr + i * n

要获取指向行中元素的指针,您必须编写

( arr  + i * n ) + j

这与

arr + i ( n + j

要获取指针指向的元素,您必须取消引用指针

*( arr + i * n + j )