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

scanf(“%d”和(*a&“x2B”i)与scanf(“%d”和“a[i][j”)之间的差异,c,arrays,C,Arrays,根据我的理解,a[i][j]可以理解为*(*a+i)+j,但我用其中两种符号扫描,我看到了区别,下面是代码片段 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 , Adr

根据我的理解,a[i][j]可以理解为*(*a+i)+j,但我用其中两种符号扫描,我看到了区别,下面是代码片段

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));
        }
    }

有人能解释一下两种情况下的记忆表示法吗

一个简单的优先级问题<代码>(*a+1)应该是
*(a+1)

否则它就相当于:
(*(a+0)+i+j)

你说过

根据我的理解,a[i][j]可以理解为*(*a+1)+j,但我用其中两种符号扫描,我看到了区别,下面是代码片段

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));
        }
    }
我猜你是打错了。你的意思是
*(*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
(*(a+i)+j)
。注意内圆括号的位置。另外,使用
%p
打印指针。使用
%ld
是未定义的行为。