代码之家  ›  专栏  ›  技术社区  ›  mouche

[]操作符是如何工作的?

  •  1
  • mouche  · 技术社区  · 14 年前

    程序如何正确地使用数组[0]或数组[6]获取正确的数据,而不管它保存的数据类型是什么?它是在内部存储长度还是要查找某种分隔符?

    11 回复  |  直到 11 年前
        1
  •  13
  •   Jens Gustedt    14 年前

    sizeof 并将右字节偏移量添加到指针。

    a[10] *(a + 10) 相当于 *(10 + a) 这又相当于 10[a]

        2
  •  7
  •   Jerry Coffin    14 年前

    编译器计算出编译时的大小,并硬编码目标代码中的大小。

        3
  •  6
  •   stakx - no longer contributing Saravana Kumar    14 年前

    有一个 interesting article on Dennis Ritchie's homepage on the history of C 关于数组,数组索引,等等有很多要说的。

    这可能不会直接回答您的问题,但它可能会加深您对C数组的理解。。。这是一本有趣的读物。

        4
  •  5
  •   David Gelhar    14 年前

    对于数组,编译器知道:(a)数组开头的地址,以及(b)数组包含的元素类型(int、float、double等),以及每个元素的长度。

    array[6] 这是一个简单的算术问题:从基址开始,加上6倍于一个元素的大小。

        5
  •  3
  •   Novikov    14 年前

    int getInt(void * memory, offset)
    {
         return *((int *)(sizeof(int)*offset + memory))
    }
    
    void * chunkOfMemory = malloc(0x1000);
    int * intarray = (int *) chunkOfMemory;
    printf("%d is equal to %d", getInt(chunkOfMemory, 9), intarray[9]);
    
        6
  •  2
  •   kennytm    14 年前

    编译器在编译时知道数组中每个元素的大小。例如:

    int64_t array[5];
    ...
    int64_t a = array[3];
    

    addr <- array
    addr <- addr + 3 * sizeof(int64_t)
    //                 ^^^^^^^^^^^^^^^ which the compiler knows is 8
    //             ^^^^^^^^^^^^^^^^^^^ which the compiler can replace with 24.
    a <- *addr 
    

        7
  •  1
  •   pmg    14 年前

    它是 !

    编译器知道数组元素的大小,并使用它来计算正确的地址。

        8
  •  0
  •   Andrey    14 年前

    不,它没有。它只是在地址处获取/设置元素 array + X*sizeof(TypeOfArrayEl) 所以你可以很容易地越界,没有人会给你错误的时候。这就是为什么 array[6] 与相同 6[array]

        9
  •  0
  •   nmichaels    14 年前

    int array[12];
    

    这个 [] array 指向第一个。这会导致像 3[array] 给你数组中的第三个元素。

        10
  •  0
  •   Community Jaime Torres    7 年前

    是的,你是对的,这是一个更低级的问题,甚至连汇编程序都有 [] 接线员。 This 答案很好,但我的解释是:

    arr[x] 与相同 *((void *)(&arr) + x * sizeof(arr[0]))

    它看起来有点复杂,但生成的代码很简单。因为我知道 sizeof(arr[0]) 而且它也是硬编码的编译代码 (void *)(&arr)

    还有一件事,我提到了低级语言,所以需要提到高级语言。使用它们你可以重载操作符,让它做任何你想做的事情。

        11
  •  -2
  •   Sidharth Panwar    14 年前

    据我所知,如果索引超出范围,C不会给出编译时错误。 即使超出了界限,指针也只会为您提供下一个相邻的内存位置。C唯一关心的是增加指针的字节数。 如果它是一个整数数组,那么指针对于索引中的每一个增量将前进2个字节,对于char它将增加1个字节。

    您总是可以访问超出界限的位置,但这是垃圾数据,作为程序员,您必须确保您访问的是正确的数据。

    我想这就是自由的代价:)