【问题标题】:Isn't an array/arrayname always a pointer to the first element in C?数组/数组名不总是指向 C 中第一个元素的指针吗?
【发布时间】:2009-12-04 08:20:45
【问题描述】:

下面发生的事情不是数组名总是指向 C 中第一个元素的指针吗?

int myArray[10] = {0};

printf("%d\n", &myArray); /* prints memadress for first element */
printf("%d\n", myArray); /* this prints a memadress too, shows that the name is a pointer */

printf("%d\n",sizeof(myArray)); /* this prints size of the whole array, not a pointer anymore? */
printf("%d\n",sizeof(&myArray)); /* this prints the size of the pointer */

【问题讨论】:

  • 为了printf指针值你应该使用%p格式说明符。您正在使用%d,这是完全没有意义的事情。
  • C 常见问题解答似乎已关闭,但您谷歌“c 常见问题解答数组”并访问缓存版本。
  • @AndreyT 你是什么意思没有意义,你用 %d 得到十进制,用 %p 得到十六进制,对,但你的意思可能是内存按 def 是十六进制的?
  • 指针是与整数(或长整数)不同的数据类型,并且可能具有不适合以整数格式显示的内部结构。示例:在 386 上的 Turbo C 中,指针是段:偏移量(即 2 个整数)并具有特殊格式,带有 %p;使用 %d 输出会失败或隐藏一些信息。
  • 而在 x86_64 上,%p 想要一个 8 字节的数据类型,而 %d 只有 4 个字节。

标签: c arrays pointers


【解决方案1】:

数组名是数组名。数组名是标识整个数组对象的标识符。它不是指向任何东西的指针。

当在表达式中使用数组名称时,数组类型在几乎所有上下文中都会自动隐式转换为指向元素的指针类型(这通常称为“数组类型衰减”)。结果指针是一个完全独立的临时右值。它与数组本身无关。与数组名无关。

隐式转换不发生时的两个例外是:运算符sizeof 和一元运算符&(地址)。这正是您在代码中测试的内容。

【讨论】:

  • 但它不是像整数、双精度数等那样的标识符,例如你不能这样做: int myArray1[] = {0}; int myArray2[] = {0};我的阵列 2 = 我的阵列 1; - 这就像说 1 = 3 ?
  • 它是一个标识符,只是不能分配给它。另一个无法分配的标识符是:const int a = 0;,尽管不是出于同样的原因。
  • @Chris_45:它是“与整数类似”的标识符,除了赋值运算符上下文不排除在发生“数组类型衰减”的上下文集中。结果是数组是不可修改的左值(正如史蒂夫所说)。
【解决方案2】:

注意类型。

  • myArray 的类型是int[10]
  • &myArray 的类型是int (*)[10](指向int[10] 的指针)。
  • 评估时,myArray 的类型为 int *。 IE。 myArray的类型是int *
  • sizeof 不评估其参数。因此sizeof(myArray) == sizeof(int[10]) != sizeof(int *)

推论:

  • myArray&myArray 是不兼容的指针类型,不能互换。

您无法将&myArray 正确分配给int *foo 类型的变量。

【讨论】:

    【解决方案3】:

    数组不是指针。但是,如果在表达式中使用了数组名称,而该表达式既不是 & 运算符也不是 sizeof 运算符的主题,它将计算为指向其第一个元素的指针。

    【讨论】:

    • 但这怎么会是真的:int *point;点 == myArray;点 == &myArray[0];
    • 因为在这两种情况下,myArray 不是 &sizeof 的主题,所以它计算为指向其第一个元素的指针 - 即是,&myArray[0]
    【解决方案4】:

    不,数组第一个元素(以及其余元素)。在将它作为参数传递给函数之前,它不会被转换为指针。

    【讨论】:

      【解决方案5】:

      arrayname 将指向数组的所有元素。这就是你能做到的原因 (arrayname + 5) 指向数组中的第 5 个元素。

      【讨论】:

      • 我的意思是 arrayname 指向整个对象而不是数组的任何单个元素。
      【解决方案6】:

      数组名不是指针,但它可以被视为指向数组第一个元素的指针。

      【讨论】:

        【解决方案7】:

        做arrayname++,你会知道arrayname一次代表整个数组,而不仅仅是起始元素....默认情况下它保留第一个元素的起始地址

        【讨论】:

          猜你喜欢
          • 2022-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-28
          • 2017-12-17
          • 1970-01-01
          • 2018-05-11
          相关资源
          最近更新 更多