输出在3D数组的指针中打印地址而不是值

时间:2015-08-07 16:18:10

标签: c++ c arrays pointers

我正在尝试使用指针声明3D数组并将值存储到3D数组中。但我可以使用scanf获取输入,但输出始终打印地址而不是数组的值。以下是我的代码。我在这里做错了什么?

#include <stdio.h>

void main()
{
   int b[3][3][3];
   int l1,l2,l3;
   int *pa2[3][3];

   pa2[3][3]=b;

   for(l1=0;l1<3;l1++)
   {
      for(l2=0;l2<3;l2++)
      {
         for(l3=0;l3<3;l3++)
         {
            scanf("%d",(((pa2+l1)+l2)+l3));
         }
      }
   }

   for(l1=0;l1<3;l1++)
   {
      for(l2=0;l2<3;l2++)
      {
         for(l3=0;l3<3;l3++)
         {
            printf("%d\n",*(((pa2+l1)+l2)+l3));
         }
      }
   }
}

4 个答案:

答案 0 :(得分:1)

为什么要使用指针pa2?使用

scanf("%d",&b[l1][l2][l3]);

printf("%d\n",b[l1][l2][l3]);

如果你坚持使用积分,你需要让指针算术正确。阵列存储器连续布局(比较How are multi-dimensional arrays formatted in memory?)。以下示例可以解决这个问题:

#include <stdio.h>

int main(int argc, char **argv) {
    int a[3][4][5];
    void *p = a;

    int x = 0;
    int i, j, k;
    for(i = 0; i < 3; ++i) {
        for(j = 0; j < 4; ++j) {
            for(k = 0; k < 5; ++k) {
                a[i][j][k] = x++;
            }
        }
    }

    const size_t s = sizeof(int);
    for(i = 0; i < 3; ++i) {
        for(j = 0; j < 4; ++j) {
            for(k = 0; k < 5; ++k) {
                printf("%d ", *(int*)(p + 20*i*s + 5*j*s + k*s));
            }
            printf("\n");
        }
        printf("\n");
    }

    return 0;
}

答案 1 :(得分:1)

pa行和scanf行中使用指针printf来访问数组是错误的。

你有

scanf("%d",(((pa2+l1)+l2)+l3));

(((pa2+l1)+l2)+l3)评估的内容是什么?

只是(pa2+l1+l2+l3)。我相信这不是你的意思。通过使用它,您有一个受未定义行为影响的程序。

您可以使用:

&(pa2[l1][l2][l3])

如果您坚持使用不太清晰的表格,则需要使用:

(*(*(pa2+l1) + l2) + l3)

对于printf语句,您可以使用:

printf("%d\n", pa2[l1][l2][l3]);

printf("%d\n", *(*(*(pa2+l1)+l2)+l3));

<强>更新

pa2的声明和设置它的行也是错误的。

而不是

int *pa2[3][3];
pa2[3][3]=b;

你需要:

   int (*pa2)[3][3];    
   pa2=b;

或一个班轮:

   int (*pa2)[3][3] = b;

答案 2 :(得分:0)

3D数组是一个数组数组的数组,因此在向指针添加偏移量后,您需要取消引用它并重新开始:

*(*(*(pa + l1) + l2) + l3)

这相当于:

pa[l1][l2][l3]

答案 3 :(得分:-2)

我不确定你真正想用这个程序完成什么,但我认为我看到了部分问题。

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:nameField 
                                                     attribute:NSLayoutAttributeRight 
                                                     relatedBy:NSLayoutRelationEqual 
                                                     toItem:cell attribute:NSLayoutAttributeRight 
                                                     multiplier:1.0 constant:0]
[namefield addConstraint:constraint];

在尝试向其添加值之前,您应该取消引用指针。

因此:

printf("%d\n",*(((pa2+l1)+l2)+l3));

否则,您正在执行指针运算,这可能是您在输出中看到十六进制地址的原因。