我在向我的4d数组声明指针时遇到问题。
我已经宣布这样:
int matrix[7][4][5][5] =
{
{/* Section 1 */
{
/* 1st */
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,1,0}
},
{
/* 2nd */
{0,0,0,0,0},
{0,0,0,0,0},
{1,0,0,1,1},
{0,0,0,0,0},
{0,0,0,0,0}
},
. . .
}/* End Section 1 */
}
我希望能够在评论/* 2nd */
下方打印出2d数组中的元素。
我有一些代码循环遍历2d数组:
for(int i = 0; i < 5; i++)
{
for(int j=0; j<5; j++)
{
std::cout << " " << pMatrixPtr[i][j];
}
std::cout << "\n";
}
但我的问题是 - 我不知道将pMatrixPtr设置为什么,或者它应该是什么类型(我的意思是指针的级别......应该是**
?)。我没有尝试任何东西似乎编译,我认为这是因为我不完全了解涉及哪些类型。
任何人都可以解释如何通过指针访问4d数组,以及该指针应该指向什么?
答案 0 :(得分:3)
如果要打印仅在注释/ 2nd /下的内容,则可以手动选择前两个数组块并应用最后两个块的循环,例如...
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
std::cout<<" "<<matrix[7][1][i][j];
}
std::cout<<"\n";
}
使用指针会使其变得复杂。
答案 1 :(得分:3)
int (*pMatrixPointer)[5] = matrix[0][1];
将pMatrixPointer
设置为指向matrix
中的第二个2D数组。然后,您将在上面的代码中使用它:
for(int i = 0; i < 5; i++)
{
for(int j=0; j<5; j++)
{
std::cout << " " << pMatrixPtr[i][j];
}
std::cout << "\n";
}
为什么会这样:
在大多数情况下,数组类型的表达式将转换为指针类型的表达式,表达式的值将是数组中第一个元素的地址(对于C和C ++都是如此)。
表达式 matrix[0][1]
的类型为“5元素阵列int
”;根据上面的规则,表达式将转换为“指向int
”(int (*)[5]
)的5个元素数组的类型,值为&matrix[0][1]
。
表达式a[i]
相当于*(a + i)
;下标操作中存在隐式取消引用。因此pMatrix[i]
相当于*(pMatrix + i)
,它产生的指针值与j
进一步偏移,为*(*(pMatriux + i) + j)
。
答案 2 :(得分:1)
指向4D数组的指针不容易从头开始定义,我总是使用typedef来帮助:
typedef int MATRIX_1D[5]; // 5 element array of int
typedef int* MATRIX_1D_PTR; // pointer to int array
typedef MATRIX_1D MATRIX_2D[5]; // 5 element array of 5 element array of int
typedef MATRIX_1D* MATRIX_2D_PTR; // pointer to array of 5 element array of int
typedef MATRIX_2D MATRIX_3D[4]; // 4 el. arr. of 5 el. arr. of 5 el. arr. of int
typedef MATRIX_2D* MATRIX_3D_PTR; // pointer to arr. of 5 el. arr. of 5 el. ...
typedef MATRIX_3D MATRIX_4D[7]; // 7 el. arr. of 4 el. arr. of 5 el. arr. of 5...
typedef MATRIX_3D* MATRIX_4D_PTR; // pointer to array of 4 element array of ...
所以对你的情况来说:
MATRIX_2D_PTR pMatrixPtr = matrix[0][0];
for(int i = 0; i < 5; i++)
{
for(int j=0; j<5; j++)
{
std::cout << " " << pMatrixPtr[i][j];
}
std::cout << "\n";
}
正如您所看到的,pMatrixPtr
是指向5类int类型数组的数组的指针。这就是我如何定义MATRIX_2D_PTR
类型。
作为奖励答案 - 如何迭代整个矩阵的方式:
void printMatrix(MATRIX_4D_PTR* p)
{
for (int i1 = 0; i1 < 7; ++i1)
for (int i2 = 0; i2 < 4; ++i2)
for (int i3 = 0; i3 < 5; ++i3)
for (int i4 = 0; i4 < 5; ++i4)
std::cout << p[i1][i2][i3][i4] << std::endl;
}
int main() { printMatrix(matrix); }