如何在C中使用多维数组进行指针算术?

问题描述 投票:1回答:2

我将如何在多维数组中使用指针?在每个方向上,我将如何用指针算法代替所做的工作?我已经将我的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 pointers multidimensional-array pointer-arithmetic
2个回答
2
投票

请记住,尽管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中的描述)。


0
投票

因此,对于我的细分错误,我只是在跟踪器数组中使用了错误的变量。但是,尽管如此,作为一个相当新的程序员,进行这些对话并感谢您的所有帮助是一件好事!我很高兴探讨了索引和指针的用法。

数组必须为

*(sites + 400)
© www.soinside.com 2019 - 2024. All rights reserved.