【问题标题】:Please explain the difference请说明区别
【发布时间】:2012-08-05 03:51:08
【问题描述】:

我有一个关于二维数组的程序

基本地址是8678

#include<stdio.h>
#include<conio.h>
main()
{
 int arr[3][3]={
                 {83,8,43},
                 {73,45,6},
                 {34,67,9}
                 };
printf("%d ",&arr+1);  //points to 8696
printf("%d ",arr+1);   //points to 8684
return 0;
}  

arr+1&amp;arr+1 有什么区别?

【问题讨论】:

    标签: c pointers multidimensional-array


    【解决方案1】:

    嗯,它们是不同的东西。 arr 在大多数情况下会衰减为指向数组第一个元素的指针——这意味着指向二维数组中第一个 3 元素行的指针:键入 int (*)[3]。然后arr + 1 指向数组的第二行。

    &amp;arr 是数组本身的地址(类型为int (*)[3][3]),所以&amp;arr + 1 指向刚刚超过整个二维数组末尾的内存。

    您可以通过不同的打印方式轻松确认此行为。具体来说,将偏移量打印到新指针而不是值本身将有助于清除问题。这些打印语句的程序输出:

    printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr);
    printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr);
    

    分别是&amp;arr+1arr+1 的小数偏移量。这是我刚刚进行的测试运行的输出:

    36
    12
    

    36 匹配:3 行 × 3 列 × 每个条目 4 字节 = 36 字节。 12 也是如此:1 行 × 3 列 × 每个条目 4 字节 = 12 字节。

    注意 - 您还使用 %d 打印指针,这是错误的。您可能应该为此使用%p

    【讨论】:

      【解决方案2】:

      您可以借助以下等式来解决这个问题:X[Y] === *(X+Y)

      由于 *(arr+1) === arr[1], arr+1 === &arr[1]

      同样,&arr+1 === &((&arr)[1])

      什么是 (&arr)[1]?好吧,(&arr)[0] === *&arr === arr, 也就是说,3x3 数组本身,所以 (&arr)[1] 是紧随其后的 3x3 数组, &arr+1 === &((&arr)[1]) 是 &arr 之后的 3x3 数组的地址 ... 一个指向刚刚超过整个数组的字节的指针。

      【讨论】:

        【解决方案3】:

        arr+1 给出数组中的下一个元素,而 &arr +1 给出下一个整数数组的地址

        【讨论】:

          【解决方案4】:

          array + 1 表示 array[1] 的地址,它需要 3 个 int 内存。

          &array + 1 表示array[0]的地址加1;

          【讨论】:

          • 错了。试试看,你会看到的。或者甚至只是看一下 OP 的输出,我猜。
          • 泳池英语让你误会了我。 array 是指向数组地址的指针,(array + 1) 是指向 array[1] 地址的指针。 &array 是数组的地址,然后加 1。
          • 卡尔·诺鲁姆,你误会我了。
          猜你喜欢
          • 2023-01-19
          • 2014-02-23
          • 2014-01-06
          • 2022-11-26
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          相关资源
          最近更新 更多