在下面的代码中,当 arr 被传递给转置函数并检查 a 的内容作为 a[0] 时,它给出 0x00...001但不是为 arr 检查的原始地址,为什么会这样,有什么问题?。我希望 a[0] 是数组中 1 的地址,而 a[0][1] 是数组的第一个元素。请解释。
问题:
int arr[][4] = { { 1, 2, 3, 4},{ 5, 6,7,8 },{ 9,10,11,12 } };
transpose((int **)arr, 3, 4);
int** transpose(int** a, int m, int n)
{
int** output = new int*[n];
for (int i = 0;i < m;i++)
{
output[i] = new int[n];
}
for (int i = 0;i < m;i++)
{
for (int j = 0;j < n;j++)
{
//*((output[j]) + i) = *(a[i] + j);
//*((output[j]) + i) = a[i][j];
output[j][i] = a[i][j];
}
}
return output;
}
抛出异常。
工作正常:
int** output=transpose((int *)arr, 3, 4);
print(output,3,4);
int**transpose(int * a, int m, int n)
{
int** t = new int*[n];
for (int i = 0;i < n;i++)
{
t[i] = new int[m];
}
for (int i = 0;i < m;i++)
{
for (int j = 0;j < n;j++)
{
t[j][i] = *((a + i*n) + j);
}
}
return t;
}
void Matrix::print(int ** a, int m, int n)
{
for (int i = 0;i < m;i++)
{
for (int j = 0;j < n;j++)
{
std::cout << a[i][j] << ",";
}
std::cout << "\n";
}
}
最佳答案
为了使您的代码能够处理二维数组,应如下所示修改代码。
int arr[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
transpose(&arr, 3, 4);
int** transpose( int(*a)[3][4], int m, int n)
{
int** output = new int*[n];
for (int i = 0; i < m; i++)
{
output[i] = new int[n];
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
//*((output[j]) + i) = *(a[i] + j);
//*((output[j]) + i) = a[i][j];
if (i < n && j < m )
{
output[j][i] = (*a)[i][j];
}
}
}
return output;
看参数声明int(*a)[3][4]
.它说变量 a
是指向大小为 [3][4] 的二维数组的指针。附加检查 if (i < n && j < m )
确保数组访问不会越界。
它会毫无异常(exception)地工作!
关于C++ 二维数组和指针引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43042145/