C 为什么二维数组元素不使用*(a+;1)打印?

C 为什么二维数组元素不使用*(a+;1)打印?,c,pointers,multidimensional-array,C,Pointers,Multidimensional Array,我正在尝试使用相同的整数接受和打印2D数组,让我们取I和j,但我没有得到预期的输出。我使用*(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++)

我正在尝试使用相同的整数接受和打印2D数组,让我们取
I
j
,但我没有得到预期的输出。我使用*(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??
}
#包括
int main()
{
INTA[3][4];
int i,j,k,l;
printf(“输入元素\n”);

对于(i=0;i您的答案非常简单,您可以对数组(*(arr+n))执行此操作,arr是一个地址,n是no 您搜索的元素地址的名称。如果要将地址搜索到矩阵中,必须首先将矩阵地址转换为数组地址,如:
*(*mat+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]?
    }
}
#包括
int main()
{
INTA[3][4];
int i,j,k,l;
printf(“输入元素\n”);
for(i=0;i
*(a+i)
肯定是
a[i]

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

  • 您的数组读取值超出范围。您通过
    int a[1][4]
    (容纳1*4=4元素的空间)定义数组,然后读取3*4=12元素

  • 另外,
    a
    指向整个二维数组,
    a+1
    指向下一个二维数组。因此,您需要通过指向数组的第一个元素进行访问

  • 所以基本上有效的访问是

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

    for(i=0;i什么是*(a+i)?它是a[i]?-ya它是。你可以用多种形式表示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、整数r、整数c)
    {
    int i,j;
    
    对于(i=0;i您可以尝试实现的最佳方法是使用指向2D数组基址的指针,然后按照您的意愿线性遍历数组

    同样,正如萨提斯已经回答的,*(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)); 
        }                             
    }
    
    #包括
    int main()
    {
    INTA[3][4];
    inti,j,k,li,*p;
    printf(“输入元素\n”);
    
    根据定义,for(i=0;i
    *(a+i)
    实际上与
    a[i]相同
    。它是数组
    a
    i
    第个元素,它又是一个由4个整数组成的一维数组。在大多数上下文中,数组名称会衰减为指向其第一个元素的指针。这就是你打印地址的方式。除此之外,还有大量缓冲区溢出。你的
    scanf
    循环超出了范围。因此你的程序将表现出未定义的行为,不管有什么更有用的答案将解释指针和2d数组。你将在循环/scanf中离开数组的边界。不知道你这样做是否是为了处理溢出。还要注意,你根本没有2d数组。
    a[1][4]
    表示它是一个1乘4的数组,几乎是一维的。不必指定p=&a[0][0];12次。一次就足够了。
    #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)); 
        }                             
    }