我将如何在多维数组中使用指针?在每个方向上,我将如何用指针算法代替所做的工作?我已经将我的ptr定义为* location。我认为我需要进行更改,因为当totalHops> 400时出现分段错误。因此,每次显式更改x,y,z一定会导致此错误。背景:我正在逐个3D空间中逐个移动粒子。我有一个随机数发生器,用于确定每次粒子随机移动位置时粒子是否向左,向右,向上,向下,向后或向前移动。 (请注意,我已将系统设计为具有周期性边界条件)。
const int L = 10;
int N = L*L*L;
const int totalHops = 200;
int sites[L][L][L] = {};
int x = 0, y = 0, z = 0;
int tracker[N] = {};
int *location;
location = &sites[0][0][0];
for (int i = 1; i <= totalHops; i++) // the random walk //
{
int direction = randomInt(6); // six possible directions to move //
// along x //
if (direction == 0) { // move in negative direction //
x -= 1;
if (x == -1)
{
x = L-1;
}
}
if (direction == 1) { // move in positive direction //
x +=1;
if (x == L)
{
x = 0;
}
}
// along y //
if (direction == 2) { // move in negative direction //
y -= 1;
if (y == -1)
{
y = L-1;
}
}
if (direction == 3) { // move in positive direction //
y +=1;
if (y == L)
{
y = 0;
}
}
// along z //
if (direction == 4) { // move in negative direction //
z -= 1;
if (z == -1)
{
z = L-1;
}
}
if (direction == 5) { // move in positive direction //
z +=1;
if (z == L)
{
z = 0;
}
}
tracker[i] = sites[x][y][z]; }
非常感谢您的提前帮助。
请记住,尽管C
容纳2D,3D,...,nD数组之类的数组符号,从人类可读性的角度来看,使它们更自然地工作。但是在内存中,数组实际上是作为连续内存的单个块创建的。例如,您的数组:
const int L = 10;
...
int sites[L][L][L] = {0}; //(using {0} is an idiomatic way to init. arrays to all 0
从内存中以sites
指向的存储位置开始,以10 * 10 * 10个连续的sizeof(int)节的形式排列在内存中。
| | | | | | | | | ...| | | |
^ ^
sites + 0 sites + (10*10*10 - 1)*sizeof(int)
由于这个事实,指针数学变得非常简单:
*(sites + 0) is equivalent to sites[0][0][0]
*(sites + 1) is equivalent to sites[0][0][1]
*(sites + 2) is equivalent to sites[0][0][2]
...
*(sites + 10) is equivalent to sites[0][1][0]
...
*(sites + 100) is equivalent to sites[1][0][0]
...
*(sites + 998) is equivalent to sites[9][9][8]
*(sites + 999) is equivalent to sites[9][9][9]
指针表示法和数组表示法之间的模式非常明显,因为添加到数组开头的数字与数组表示法中的索引排列很好地相关。
基于此基本形式,您可以派生一种方法来使用指针数学来表示多维数组,然后,根据您的情况,使用初始化为int *location;
开头的sites
可用于跟踪(或确定)哪个元素3D
数组的大小正在查看或修改。
这可以很好地应用于您在跟踪totalHops
时遇到的特定问题,并且根据x,y,z
的任意方向在1-10范围之外的值进行决策可能比基于诸如[ C0](根据您在OP中的描述)。
因此,对于我的细分错误,我只是在跟踪器数组中使用了错误的变量。但是,尽管如此,作为一个相当新的程序员,进行这些对话并感谢您的所有帮助是一件好事!我很高兴探讨了索引和指针的用法。
数组必须为
*(sites + 400)