【问题标题】:What is the dfference between &a[0] and a in this program?这个程序中的 a[0] 和 a 有什么区别?
【发布时间】:2012-08-03 09:44:36
【问题描述】:

我在下面有一个程序...我有一个 turbo c 编译器所以int 是 2 个字节..

#include<stdio.h>
main()
{
    int a[3][2]={
                 {1,3},
                 {2,0},
                 {3,4}
                };
    printf("%d",(a+1));   //increments 2 bytes
        printf("%d",(&a[0]+1)); // increments 4 bytes
        printf("%d",(a[2]));
    return 0;
 }

a+1&amp;a[0]+1 有什么区别?

【问题讨论】:

  • 你为什么不检查if(a==&amp;a[0])

标签: c arrays multidimensional-array


【解决方案1】:

它们是等价的表达式。

a + 1&amp;a[0] + 1 的值相同,并且都是 int (*)[2] 类型。

请注意,您没有正确打印指针值:使用 p 转换说明符并将参数转换为 (void *) 以打印指针的值:

printf("%p\n", (void *) (a + 1)); 
printf("%p\n", (void *) (&a[0] + 1)); 
printf("%p\n", (void *) (a[2]));

【讨论】:

    【解决方案2】:

    您的编译器似乎有错误。如果a 命名一个数组,那么在[大多数] 表达式中a&amp;a[0] 应该具有相同的类型和值,因此+1 的结果在这两种情况下应该是相同的。

    a+1&amp;a[0]+1 都应该等价于&amp;a[1]

    为了在测试时严格正确,您应该使用%p 作为显示指针值的格式说明符。

    【讨论】:

    • 它们都具有相同的值,但在递增时...它们具有不同的值...
    • @AmolSingh:是的,但他们不应该因为他们也有相同的类型。
    【解决方案3】:

    a 将数组命名为 int a[3][2],因此它的类型为 int [3][2]。在表达式a + 1 中,它衰减为指向第一个元素的指针,因此它的类型为int (*)[2]

    在表达式&amp;a[0] 中,a 再次衰减为int (*)[2] 类型的指针,因此a[0] 具有int [2] 类型。 address-of 运算符是一种特殊情况,它不会引发指针衰减,因此&amp;a[0] 的类型为int (*)[2],并且与衰减后的a 具有相同的类型和值。

    我猜想你的编译器在&amp;a[0] 中错误地衰减a[0],所以它给&amp;a[0] 提供了int ** 类型。如果您平台上的数据指针大小为 4 个字节,则可以解释观察到的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2019-02-20
      • 2018-06-27
      • 2013-12-24
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多