考虑您典型的 gcc 编译器(C99 模式)并考虑一个数组:
char array[2][4];
Run Code Online (Sandbox Code Playgroud)
显然编译器会编译(我假设它在翻译过程中?)使目标机器(假设它是 X86)以它“解决”的方式工作的代码,或者我们可以说,“分配”两个地址array[0][0] 和 array[1][0] 在访问其中任何一个之前(我可能完全错了)。我的问题是编译器如何“知道”这一点,因为它只是一个愚蠢的程序?它是某种简单的递归算法,做得非常正确,所以我们真的不必关心有多少维(如“哦,名称“数组”后面有一个括号对?我只是翻译它进入一个地址,等待,有2个?地址然后)或那些设计编译器的人专门研究了这种情况并编写了编译器来解决它?
如果您对我的问题感到困惑,请考虑一维数组 arr[2]。我可以让 arr 参与各种计算,知道它只是一个地址,可以说是“起始地址”。但是对于一维数组,您只需要一个“起始地址”,这在编译期间很容易完成,因为编译器只会将该名称(在本例中为 arr)转换为未初始化的地址(同样,我可能完全错了),但是对于一个二维数组,编译器需要处理多个地址,它是如何工作的?
汇编代码会是什么样子?