【问题标题】:About 2D-array pointer in C [closed]关于C中的二维数组指针[关闭]
【发布时间】:2013-08-06 07:06:35
【问题描述】:

这里定义了一个数组:

int a[2][5]={{1,2,3,4,5},{6,7,8,9,10}};

这句话是什么意思?:

int *p = (int*)(&a+1);

为什么*p的输出是6?

printf("%d",*p);//6

特别是,请解释一下(int*)&a+1是什么意思。

【问题讨论】:

  • 阅读一本好的 C 编程 书要花很多时间。我们没时间教你C
  • 请将 Google 视为您的信息来源。
  • 如果你期望6 如果int *p = (int *)(&a[0]+1);

标签: c pointers multidimensional-array


【解决方案1】:

首先说明,int a[2][5] = {1,2,3,4,5}; 不是一个完全有效的数组定义。

gcc 发出这些警告:

test.c:10:3: 警告:初始化器 [-Wmissing-braces] 周围缺少大括号

test.c:10:3: 警告:('a[0]' 接近初始化)[-Wmissing-braces]

你的数组是2x5,这意味着它应该有10个元素:int a[2][5]={{1,2,3,4,5}, {6,7,8,9,10}};是一个更正确的定义。

现在,问题是:int *p = (int*)(&a+1);。这声明了一个指向 int 命名 p 的指针。 (int *) 是一个演员。所以你基本上将(&a + 1) 转换为(int *)

但是,请注意(&a + 1) a[1] 不同

【讨论】:

    【解决方案2】:

    像这样定义你的数组:

    int a[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
    

    然后使用你的数组:

    int * p = (int*)(&a[0][0]+1); 
    

    int * p = (int*)(a+1);
    

    【讨论】:

      【解决方案3】:

      &a 计算为数组a 的地址。 将 1 加到数组的地址将增加 1 倍的数组包含的大小。在这种情况下,数组 a 包含 5 个 int 的数组,因此表达式的计算结果为距数组地址 5 int 的 int 地址,或 int 的地址 6 .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2021-12-24
        • 2013-01-26
        • 1970-01-01
        相关资源
        最近更新 更多