【问题标题】:How can the compiler in C get the difference between the address of the first element of the array and the address of the whole array?C中的编译器如何获得数组第一个元素的地址和整个数组的地址之间的差异?
【发布时间】:2020-03-24 11:39:18
【问题描述】:

鉴于这个问题,我完全了解以下事实:

1) 数组的名称是指向它的第一个元素的固定指针。

2) 二维矩阵的名称是它的第一个一维数组的地址。

3) 以及 x[i] 和 &x[i] 在算术运算中的区别(其中 i 是非负整数)。

编译器是MinGW C 中的编译器如何获得数组第一个元素的地址和整个数组的地址之间的差异,尽管它们具有相同的数值?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(void)
{
    int x[3][3] = {1,2,3,4,5,6,7,8,9} ; 
    int *p  ; 
    for(p = &x[0] ; p < &x[0] + 1 ; p++) //Warning: comparison of distinct pointer types in this line of code 
        printf("%d\n",*p) ; 

    return 0 ; 
}

【问题讨论】:

  • 使用代码格式化程序而不是图像按原样发布代码
  • 不清楚你问的是第一个元素,还是元素i
  • p &amp;&lt; x[0] + 1 看起来像是语法错误。
  • 对不起,这是另一个程序。我现在上传了正确的。
  • &amp;x[0] 不是int *!!

标签: c compiler-construction mingw


【解决方案1】:

您正在分配/比较两种不同的指针类型。

x 具有int [3][3] 类型,即int 的大小为3 的数组的大小为3 的数组。从那里,x[0] 的类型为int [3],即int 的大小为3 的数组。

随后,&amp;x[0] 具有int (*)[3] 类型,即指向int 大小为3 的数组的指针。相反,p 的类型为int *,即指向int 的指针。这些是不同的类型,这就是编译器向您发出警告的原因。

编译器或多或少地以我描述的方式解析表达式,查看对象的类型并查看生成的表达式的类型如何随着每个运算符的应用而变化。

【讨论】:

  • 但是你忘了回答“C中的编译器如何得到数组第一个元素的地址和整个数组的地址之间的差异,尽管它们具有相同的数值?
  • @ArdentCoder:我认为这只是一个语言问题,OP 并不是从字面上询问差异是如何计算的。
  • @EricPostpischil 您在那里误解了“差异”的含义。这不是“减法”类型的差异。也许答案与types有关。
  • @MohamedAtef 该标准确实允许在指针类型之间进行转换,但是在大多数情况下,比较它们没有意义。
  • @dbush 但是构建阶段是如何在没有错误的情况下发生的?提升还是隐式转换?
猜你喜欢
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2020-07-18
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多