如何用C语言对多维数组进行指针运算



如何在多维数组中使用指针?在每个方向上,我将如何用指针算术取代我所做的工作?我已将我的ptr定义为*位置。我想我需要做这个改变,因为当totalHops>400时,我会遇到分段错误。因此,每次显式更改x、y、z一定会导致此错误。上下文:我正在L乘L乘L的三维空间中移动粒子。我有一个随机数生成器来确定每次粒子随机移动位置时粒子是否向左、向右、向上、向下、前后移动。(注意,我已将系统设计为具有周期性边界条件(。

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

在内存中排列为内存的10*10*10序列大小的(int(部分,从sites指向的内存位置开始。

| | | | | | | | | ...| | | | 
^                        ^
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]

指针表示法和数组表示法之间的模式变得非常明显,因为添加到数组开头的数字与数组表示法中索引的排列相关。

基于这个基本形式,您可以派生出一种使用指针数学来表示多维数组的方法,在您的情况下,使用初始化到sites开头的int *location;可以用来跟踪(或确定(正在查看或修改3D数组的哪个元素。

这可以很好地应用于跟踪totalHops的特定问题,并且在x,y,z的任何方向上基于0 - 9范围之外的值做出决策可能比基于*(sites + 400)等符号做出决策更困难(根据您在OP中的描述(。

因此,作为分割错误的结论,我只是在跟踪器数组中使用了错误的变量。尽管如此,作为一个相当新的程序员,进行这些对话并感谢您的帮助是很好的!我很高兴已经探索了索引和指针的用途。

阵列需要是

int tracker[totalHops] = {};

相关内容

  • 没有找到相关文章

最新更新