0
int s[4][2]= {
             {1234,56},
             {1212,33},
             {1434,80},
             {1312,78}
             };
int i,j;
for(i=0;i<=3;i++)
{
    printf("\n");
    for(j=0;j<=1;j++)
    {
        printf("%d  ",*(s[i]+j));
    }
}

输出显示是

1234,56
1212,33
1434,80
1312,78

我们知道*(&Variable)会打印变量的值但是当我们在上面的程序中实现相同的概念时......

int s[4][2]= {
             {1234,56},
             {1212,33},
             {1434,80},
             {1312,78}
             };
int i,j;
for(i=0;i<=3;i++)
{
    printf("\n");
    for(j=0;j<=1;j++)
    {
        printf("%d  ",*(&s[i]+j));
    }
}

输出显示数组每个元素的地址。

为什么会这样?为什么输出不等于数组元素的值?

4

3 回答 3

2
于 2016-09-21T07:23:18.607 回答
0

你的数组是二维的。因此,s[i]是行的地址i(即s[i]类型int *),并且&s[i]是地址的地址(即类型int **)。当你申请*它时,你会得到一个地址(即int *)。

确实,运算符的&意思是“地址”并且*(&x)指的是 的值x

于 2016-09-21T07:22:35.467 回答
0

第一个案例

您的打印声明是这样的。

printf("%d  ",*(s[i]+j));

这里 s[i]+j 是地址。

让我们考虑 i=0,j=1 ,第一个 i 循环,第二个 j 循环。

这里 s[i] 将是值 1234 所在的地址。假设它是 489000。所以 s[i]+j ,这里 s[0]+1 将是值 56 所在的地址。假设它是 489004

所以,*(s[i]+j),即;这里 *(s[0]+1) 将给出地址 489004 的值。即 56。所以这里它将打印值 1234、56、1212 等。

第二种情况 您的打印声明是这样的。

printf("%d  ",*(&s[i]+j));

这里 &s[i]+j 是地址。

让我们考虑 i=0,j=0 ,第一个 i 循环,第一个 j 循环。

这里 s[i] 将是值 1234 所在的地址。假设它是 489000。所以 &s[i] 将是地址 489000 所在的地址。假设它是 380000。回忆一下指针的概念。

所以 &s[i]+j 将是 "地址 489000 所在的地址 + j" 。IE; 380000+j

我们在得到的这个特定的“地址”上应用了 operator * 的值。*(&s[i]+j)。所以它变成了 ['地址 489000 所在的地址' + j] 处的值。值为 [380000 + j]。

当 i=0,j=0 时,会打印 Value At[380000] ,即;489000。

因此它将打印存储值 1234、56、1212 等的地址。

于 2016-09-21T10:56:12.570 回答