为什么不使用*(a + 1)打印2D数组元素?

时间:2014-08-13 05:19:46

标签: c pointers multidimensional-array

我正在尝试接受并使用相同的整数打印2D数组,我们可以使用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??
}

4 个答案:

答案 0 :(得分: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]?
    }
}

答案 1 :(得分:0)

*(a+i)绝对是a[i]

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

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

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

  3. 所以基本上有效的访问是

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

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

答案 2 :(得分:0)

什么是*(a + i)?它是[i]吗? - 是的。你可以用多种形式表示[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)来打印2D数组)!

答案 3 :(得分:0)

你可以做的最好的方法是获取指向2D数组基址的指针,然后按照你想要的方式线性遍历数组。

另外,正如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)); 
    }                             
}