【问题标题】:Why are 2D array elements not printed using *(a+1)?为什么不使用 *(a+1) 打印二维数组元素?
【发布时间】:2014-08-13 05:19:45
【问题描述】:

我正在尝试使用相同的整数接受和打印二维数组,让我们采用 ij 但我没有得到预期的输出。我正在使用 *(a+i) 打印,但它似乎打印地址!

有人能解释一下为什么会这样吗?

#include<stdio.h>
int main()
{
    int a[3][4];
    int i,j,k,l;
    printf("enter element\n");
    for(i=0;i<3;i++)
    {
            for(j=0;j<4;j++)
                    scanf("%d",&a[i][j]);
    }
    printf("#####################\n"); 
    for(i=0;i<12;i++)       
    {

            printf("%d\n",*(a+i)); // what is *(a+i)? is it a[i]?
    }                             // how will it print all address??
}

【问题讨论】:

  • *(a+i) 根据定义确实与a[i] 相同。它是数组a 的第ith 元素,它又是一个4 个整数的一维数组。在大多数情况下,数组名称衰减为指向其第一个元素的指针。这就是你最终打印地址的方式。除此之外,还有大量缓冲区溢出。
  • 您的scanf 循环超出范围。因此,您的程序将表现出未定义的行为,无论对指针和二维数组有什么更有用的答案。
  • 您将数组的边界留在循环/scanf 中。不知道你这样做是不是故意玩溢出。
  • 另外请注意,您真的根本没有二维数组。 a[1][4] 表示它是一个 1 x 4 数组,几乎是一维的。

标签: c pointers multidimensional-array


【解决方案1】:

您的答案很简单,您对数组执行此操作 (*(arr+n)) arr 是地址,n 是否 您搜索的元素地址。如果要在矩阵中搜索地址,则必须首先将矩阵地址转换为数组地址,例如:
*(*垫+n);

您的代码将是:

# include<stdio.h>

int main()
{
    int a[3][4];
    int i,j,k,l;
    printf("enter element\n");
    for(i=0; i<3; i++)
    {
        for(j=0; j<4; j++)
            scanf("%d",&a[i][j]);
    }

    printf("#####################\n");

    for(i=0; i<8; i++)

    {

        printf("%d\n",*(*a+i)); // what is *(a+i)? is it a[i]?
    }
}

【讨论】:

    【解决方案2】:

    什么是*(a+i)?是 [i] 吗? - 是的。您可以以多种形式表示 a[i]。它们是 *(a+i) 或 *(i+a) 或 i[a]。所有都只代表相同的内存位置。

    在您的程序中,*(a+i) 不能在同一个函数中使用。尝试将数组传递给另一个函数并在那里打印它会起作用的时间。试试下面的代码-

    #include<stdio.h>
    void print(int *a,int r ,int c)
    {
            int i ,j;
            for(i=0;i<r*c;i++)
                    printf("%d\n",*(a+i));
    }
    int main()
    {
            int a[2][2];
            int i,j,k,l;
            printf("enter element\n");
            for(i=0;i<2;i++)
            {
                    for(j=0;j<2;j++)
                            scanf("%d",&a[i][j]);
            }
    
            printf("#####################\n"); 
    
            print(a,2,2); // calling my function here
    }
    

    但在实时编程中不喜欢这种类型的方法(*(a+i) 用于打印二维数组)!

    【讨论】:

      【解决方案3】:

      *(a+i) 肯定是a[i]

      您的代码中的许多错误需要先修复。

      1. 您的数组读取值超出范围。您通过 int a[1][4] 定义了数组(1*4 = 4 个元素的空间)并读取了 3*4=12 个元素。

      2. 同样a 指向整个二维数组,a+1 指向下一个二维数组。所以你需要通过指向数组的第一个元素来访问。

      所以基本上有效的访问权限是

       a[0][1] = *( a[0] + 1 ) 
      

      for(i=0;i<12;i++)   
            printf("%d\n",*(a[0]+i));
      

      【讨论】:

        【解决方案4】:

        你可以做你想要实现的最好方法是获取一个指向二维数组基地址的指针,然后按照你想要的方式线性遍历数组。

        此外,正如 Sathish 已经回答的那样,*(a+i) = *(i+a) = a[i] = i[a]

        在这里,在我的解决方案中,我刚刚添加了一个指向 a 基地址的指针 p,并且由于 2D 数组线性存储在内存中,您可以通过将指针 p 递增到下一个数组来访问它元素。

        #include<stdio.h>
        int main()
        {
            int a[3][4];
            int i,j,k,li, *p;
            printf("enter element\n");
            for(i=0;i<3;i++)
            {
                    for(j=0;j<4;j++)
                            scanf("%d",&a[i][j]);
            }
            printf("#####################\n");
            p = &a[0][0];
            for(i=0;i<12;i++)
            {
                  printf("%d\n",*(p+i)); 
            }                             
        }
        

        【讨论】:

        • 不需要指定 p = &a[0][0]; 12 次。一次就够了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多