7
                         |--------|     
//                     / |4  4  4 |     
//                   |--------| 4 | 
//                 / |3  3  3 | 4 | 
//               |---------|3 |   |
//             / | 2  2  2 |3 | /
//            |---------|2 |__|
//            | 1  1  1 |2 | /
//            | 1  1  1 |__| 
//            | 1  1  1 | /
//            |_________|
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}};

我认为这个数组由4 层组成

我想创建指向数组层的指针并使用指针遍历该数组的层。

我尝试:

double (*pp1)[sizeof(arr[0]) / sizeof(ar[0][0][0])]; 
pp1 = arr[0]; 

并从 intelIsense 得到错误:类型的值 (double (*)(3) can`t be assigned to double(*)(9)

4

3 回答 3

1

所以如果你这样做:

int i;
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},
                       {3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}};

double (*pp3)[3][3];    
pp3 = arr;    
for (i = 0; i <= 3; i++)    
{   printf("pp3 + %d is %f \n", i, ***(pp3 + i));
}   

然后你得到所需的行为。您的代码的问题在于,正如编译器告诉您的那样,您正在尝试将指针分配给 9 个双精度数组(double (*pp1)[sizeof(arr[0] / sizeof(arr[0][0][0])]计算结果为double (*pp1)[9]),但您需要一个指向 3 个数组的 3 个数组的指针,这是你用 . 声明的double arr[4][3][3]。根据我的测试,gcc 将接受double (*pp1)[9]带有编译器警告的,这是我在下面的评论中试图得到的。希望这能说明问题。

如果你想留住这个将军,那么你真正想要的是double (*pp3)[sizeof(arr[0]) / sizeof(arr[0][0])][sizeof(arr[0][0]) / sizeof(arr[0][0][0])],这是一场血腥的噩梦。

编辑:忘记取消引用...应该复制/粘贴哈哈。还添加了有关问题代码行为的解释。根据评论修复。

于 2012-09-14T11:44:47.800 回答
0

在试图弄清楚这个问题时,我得到了一些结果。

我发现以下语句不会从编译器中引发错误

double arr[4][4][9];
double (*pp3)[9];
pp3 = arr[0];

那么,从上面的代码中推断出只有在指针指向的元素数量等于数组的最小维度的情况下才能将指针分配给数组,这是否正确?

更新:我认为只能在数组的最小层上创建指针。

有人可以解释一下吗?

于 2012-09-14T10:29:26.320 回答
0

为什么不简单地获取给定层的第一个元素的方向?

double *pp1 = &ar[0][0][0];
double *pp2 = &ar[1][0][0];
/* and so on */
于 2012-09-14T10:33:13.623 回答