我正在对多维数组进行一些算术运算。还使用C ++尝试了一些代码。但是,我的代码输出与我对不同的指针和多维数组之间的关系的理论理解相矛盾。
我对2D和3D阵列的理解。
2D阵列
3D阵列
我对图2和图4中的B和C分别感到困惑。
二维数组上的代码
#include <iostream>
using namespace std;
int main(void){
int B[2][2] = {1, 2, 3, 4};
cout << B << endl;
cout << B+1 << endl;
return 0;
}
输出:
0x7ffec3dd9f80
0x7ffec3dd9f88
在这里,指向int B的指针增加了((1 * 4)+(1 * 4))= 8个单位,它是指向int(B + 1)的指针。 尽管我从Link得到了一个关于B实际指向2D数组的解释。它指向2D数组的第一个元素。
我的代码输出和对此Link的解释使我感到困惑。 B在二维数组中实际上指向什么? 并且,如果B指向2D数组的第一个元素的地址,那么为什么当我们加1时B的值增加8个单位?为什么不增加(1 * 4)单位?
3D阵列上的代码
#include <iostream>
using namespace std;
int main(void){
int C[2][2][2] = {{
{1, 2},
{3, 4}
},
{
{1, 2},
{3, 4}
}};
cout << C << endl;
cout << C[0] << endl;
cout << C[0] +1 << endl;
cout << C[0][0] +1 << endl;
return 0;
}
输出:
0x7ffeac58d130
0x7ffeac58d130
0x7ffeac58d138
0x7ffeac58d134
C给出整个数组的起始地址。但是,它具体指出了哪一部分?是指向&C [0]还是&C [0] [0]或&C [0] [0] [0]?
cout << C[0]+1 << endl; here, C[0] is increased by 8 unit. But, if C[0] is pointing the base address of 1st 2D array inside 3D array, then it must be increased by 16 unit to get base &C[1].
cout << C[0][0] +1 << endl; here, C[0][0] is increased by 4 unit. But if it is pointing the base address of 1st 1D array of 1st 2D array inside 3D array, then it must be increased by 8 unit to get base &C[0][1].
谢谢。
答案 0 :(得分:1)
图1和图3是正确的图2和图4是不正确的。 *B
和B[0]
的定义完全相同。与**B
和B[0][0]
类似。
要修复图2,实际上是复制图1,但只需将文本B[0]
更改为*B
,依此类推。 B
本身是指整个数组。图4的同上。
B+1
的定义为&(B[1])
,它是指向图1中正确标记为B[1]
的对象的临时指针。
在cout << B << endl;
中,将B
视为B+0
(即&(B[0])
)。当您在需要指针的上下文中使用数组时,会发生这种情况(创建了临时指针,它的行为与您写&B[0]
而不是B
时的行为相同)。该语句不输出B,而是输出该临时指针的值。