scanf(“%d”,((* a + i)+ j))和scanf(“%d”,& a [i] [j])之间的差异

时间:2014-06-12 05:27:45

标签: c arrays

根据我的理解,[i] [j]可以像*(* a + i)+ j一样读取,但是我用两种符号扫描扫描,我看到差异,下面是代码片段,< / p>

for (i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
    //      scanf("%d",((*a+i)+j));
            scanf("%d",&a[i][j]);
            printf("Address of &a[%d][%d]=%ld , Adress of ((*a+%d)+%d)=%ld\n",i,j,&a[i][j] ,i,j, ((*a+i)+j));
        }
    }

我得到低于输出,

1
Address of &a[0][0]=140736658532752 , Adress of ((*a+0)+0)=140736658532752
2
Address of &a[0][1]=140736658532756 , Adress of ((*a+0)+1)=140736658532756
3
Address of &a[0][2]=140736658532760 , Adress of ((*a+0)+2)=140736658532760
4
Address of &a[1][0]=140736658532772 , Adress of ((*a+1)+0)=140736658532756
5
Address of &a[1][1]=140736658532776 , Adress of ((*a+1)+1)=140736658532760
6
Address of &a[1][2]=140736658532780 , Adress of ((*a+1)+2)=140736658532764
7
Address of &a[2][0]=140736658532792 , Adress of ((*a+2)+0)=140736658532760
8
Address of &a[2][1]=140736658532796 , Adress of ((*a+2)+1)=140736658532764
9
Address of &a[2][2]=140736658532800 , Adress of ((*a+2)+2)=140736658532768

有人可以对两种情况的记忆表示有所了解......

2 个答案:

答案 0 :(得分:7)

你说,

  

根据我的理解,[i] [j]可以像*(* a + 1)+ j一样读取,但我用其中两种表示法扫描扫描,我看到差异,下面是代码片段,< / p>

我认为你有一个错字。您的意思是*(*a+i)+j而不是*(*a+1)+j

然而,事实并非如此。

a[i]相当于*(a+i),而不是(*a+i)。由于运算符优先级,*a+i相当于(*a)+i,而不是*(a+i)

同样,a[i][j]相当于*(*(a+i)+j),而不是*(*a+1)+j

答案 1 :(得分:0)

一个简单的优先问题。 (*a+1)应为*(a+1)

否则它等同于:(*(a+0)+i+j)