【问题标题】:Strange Behavior of Pointer of an array in CC中数组指针的奇怪行为
【发布时间】:2012-04-20 13:38:46
【问题描述】:

这是我编写的代码,用于测试/理解数组中/指针的行为

int main(void){
    int a[4];
    memset(a, 0, sizeof(a));
    printf("%x %x\n",a,&a);
}
Output of the above program on my machine:
bfeed3e8 bfeed3e8

我不明白为什么 a 和 &a 的值是一样的。据我了解 &a 应该给出存储 a 的内存位置的地址。 这种行为的解释是什么?

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

&a 确实为您提供了a 的地址。 a 为您提供a,因为它是一个数组,所以它衰减为指向a 的指针。

或者学究起来,它衰减为指向a[0]的指针。

【讨论】:

  • 我就是这么说的!别等等,我不是这么说的,我只是让它看起来像我说的那样。对不起。
  • 学究与不学究的区别(与a衰减的结果与&a的结果的区别相同)是类型。该数组的地址与其第一个元素相同,但&a 的类型为int(*)[4],而&a[0] 的类型为int *
  • 如果指定a,那么压入栈的东西是什么类型?
  • @MrLister 你的堆栈被输入了吗?
  • 还在想反驳,等着吧。
【解决方案2】:

在这种情况下,数组名称a 衰减为指向其第一个元素的指针。你是说

printf("%x %x\n",a[0],&a);

【讨论】:

    【解决方案3】:

    表达式&a 的类型为int (*)[4](指向int 的4 元素数组的指针),计算结果为数组对象的地址;在这方面,指向数组的指针就像指向其他任何东西的指针。

    奇怪的是表达式a 的处理方式。除非它是 sizeof 或一元 & 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则“T 的 N 元素数组”类型的表达式将替换为/ 转换为 /“衰减”为 T *(指向 T 的指针)类型的表达式,其值是数组中第一个元素的地址。由于数组的地址和数组中第一个元素的地址相同,所以两个表达式产生相同的,但它们的类型不同。

    【讨论】:

      【解决方案4】:

      数组的名称也指向它所持有的内存块的开始。没什么大不了的。

      这些都是等价的:

      printf("%x\n",a);
      printf("%x\n",&a);
      printf("%x\n",&a[0]);
      

      【讨论】:

        【解决方案5】:

        在指针上下文中,数组衰减为指针。所以a衰减到数组第一个字节的地址,&a是定义的第一个字节的地址。可能您想在 printf 中使用 *aa[0] 而不是 &a

        【讨论】:

          【解决方案6】:
          int test[10]         = test is pionter as well as &test
          

          如果你想寻址一个不是base的元素,使用&test[4]

          顺便说一句

          &test = @test[0] = test
          

          所有指向基本元素的指针

          【讨论】:

            【解决方案7】:

            数组名“a”指向数组的第一个元素。

            为了更好地理解:

              *(a + 2) is same with a[2].
            

            【讨论】:

              【解决方案8】:

              在 C 中,数组名,在这种情况下 a 被认为是一个标签,代表数组的地址。对它应用 & 被解释为同样的事情。

              函数指针也有类似的问题。如果func 是指向函数的指针,您可以同时使用func()(*func)() 调用该函数。

              存在间接语法的情况,以特殊方式处理。

              【讨论】:

                猜你喜欢
                • 2020-11-28
                • 2012-05-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-01-22
                • 2014-12-17
                • 1970-01-01
                相关资源
                最近更新 更多