对C ++数组结构的误解

时间:2014-07-18 16:27:19

标签: c++ arrays

我是C ++的新手,我学习了不同的教程,其中一个我发现了一个代码示例: 我用线条指出,我完全不明白;

  1. 这个数组是在数组中还是类似的?

  2. 我能理解第二个电话,但第一个做什么?已经有了 "坐标[blocks [num]]",不是吗?为什么需要再次阻止(i)?

  3. 如何让这部分代码更容易?是否有这个数组的结构     不容易从数组中获取价值吗?

  4. 提前致谢!

    // Global vars
    Struct Rect {
       float left;
    }
    
    Rectangle *coordinates;
    int *blocks;
    
    coordinates = new Rect[25];
    blocks = new int[25];
    // in method storing values 
    const int currentBlock = 0; //var in cycle
    coordinates[currentBlock].left = column;  
    blocks[currentBlock] = currentBlock;     
    
    //get element method
    const Rect& classA::Coords(int num) const 
    {
        return coordinates[blocks[num]]; //(2)
    }
    
    //and calling this method like
    Coords(blocks[i]);  //(3)
    Coords(i);          //(3)
    // (4)
    

1 个答案:

答案 0 :(得分:2)

  1. 不,不是真的。很多人会将它们视为数组,甚至将它们描述为数组,但它们实际上并非如此。 coordinatesblocks都是指针。他们只分别存储Rectint的单个地址。

    但是,当您执行coordinates = new Rect[25];时,您正在分配一个25 Rect的数组,并将指针coordinates设置为指向该数组中的第一个元素。因此,虽然coordinates本身是指针,但它指向数组中的第一个元素。

    您可以像对待数组一样索引coordinatesblocks。例如,coordinates[3]将访问您分配的Rect数组的第4个元素。其行为与数组相同的原因是因为它实际上是相同的。例如,如果你有一个实际的数组arr而你做arr[4],那么数组首先会被转换为指向它的第一个元素的指针,然后就会发生索引。

  2. 不,这不是数组数组。它正在做的是在一个数组(blocks[num])中查找一个值并使用它来索引下一个数组(coordinates[blocks[num]])。因此,一个数组将索引存储到另一个数组中。

  3. 我会忽略这不会编译,但在这两种情况下,您都会将int传递给Coords函数。第一种情况看起来不正确,但可能不是。它取值blocks[i],将其传递给函数,然后使用该值索引blocks以获取另一个值,然后使用该另一个值来索引coordinates。在第二种情况下,您只是传递i,该blocks用于索引coordinates以为您提供用于索引{{1}}的值。

  4. 这是一个广泛的问题,我认为如果不确切地知道你想简化什么而没有看到一些真正有效的代码,我就无法回答。