繁体   English   中英

C中的多维数组访问

[英]Multidimensional array access in C

我知道多维数组是连续分配的,所以int[4][3] arr; 将连续分配 12 个 int 单元格。

我的第一个问题是,鉴于 C 不跟踪数组的长度,它如何知道将两个坐标访问模式转换为单个坐标内存地址所需的正确算法? 例如,如果

arr == 0x? // some memory address

然后

&arr[2][1] == 0x? + 3 * 2 int cells + 1 int cell. 

哪来的3个?

我的第二个问题是在堆上分配数组时,它们是否仍然以相同的连续方式分配? 或者它是作为一个指针数组实现的,它取消了对一维数组的引用?

C 确实跟踪数组长度,但只在编译时,而不是在运行时(它没有保存在数组结构中):

#include <stdio.h>

int main(int argc, char **argv)
{
  char array[] = "hello world";
  char* char_ptr = array;

  printf("array size: %lu\n", sizeof(array));
  printf("char_ptr size: %lu\n", sizeof(char_ptr));
  printf("void_ptr size: %lu\n", sizeof(void*));

  int matrix[2][3] = {{1,2,3},{4,5,6}};
  printf("matrix size (items): %lu\n", sizeof(matrix)/sizeof(int));
  return EXIT_SUCCESS;
}

输出:

array size: 12
char_ptr size: 8
void_ptr size: 8
matrix size (items): 6

C 中有一个细微差别,数组会自动转换为指针,但指针和数组(在编译时声明)对于编译器来说仍然是两种不同的类型。

  1. 编译器只记住数组变量的类型(包括3 )。 这样它就知道在您访问它时要做什么。

  2. 编译器将在堆或堆栈上以相同的方式处理数组。 指针数组是一种完全不同的类型,因此别无选择。

请注意,使用当前的高级编译器优化,不可能知道最终代码实际上会做什么,这取决于您如何使用数组。 例如,如果只访问过一列,则其他列可能会被优化掉,从而在内存中生成一维数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM