指向数组元素地址的指针

时间:2016-09-21 07:11:09

标签: c arrays pointers multidimensional-array addressof

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

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

为什么会这样? 为什么Output不等于Array ??

的元素值

3 个答案:

答案 0 :(得分:2)

请注意s是一个二维数组,在某些情况下,数组名会衰减到指向第一个元素的指针。

这里,s[i]是数组类型,两个int的数组。

然后,引用C11,章节§6.3.2.1,

  

除非它是sizeof运算符,_Alignof运算符或者&运算符的操作数。   一元*(s[i]+j) 运算符,或者是用于初始化数组的字符串文字,一个包含的表达式   type ''类型''的数组被转换为类型''指向类型''指针的表达式   到数组对象的初始元素,而不是左值。 [...]

因此,

  • 在第一种情况下,

    s[i]

    int [2]属于int *类型,它衰减为int *,用于指针算术,生成另一个int。取消引用后,您会收到*(&s[i]+j)

  • 在第二种情况下,

    &s[i]

    由于上述相同的原因,如果是s[i]int [2]不会衰减,而且类型是“指向int [2]的指针”指针算法就可以了。因此,在这种情况下,添加的结果也是“指向int *的指针”,在最终的取消引用之后,它变为%d,这是FATAL ERROR - The following SQL query failed: ALTER TABLE "api_poi" ADD CONSTRAINT "user_id_refs_id_20f256ff" FOREIGN KEY ("user_id") REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED; The error was: insert or update on table "api_poi" violates foreign key constraint "user_id_refs_id_20f256ff" DETAIL: Key (user_id)=(1) is not present in table "auth_user". 的不匹配,这就是由您的编译器报告。

答案 1 :(得分:0)

你的阵列是二维的。因此,s[i]是行i的地址(即s[i]的类型为int *),&s[i]是地址的地址(即类型int **)。当您对其应用*时,您会获得一个地址(即int *)。

运营商&的确意味着&#34;地址&#34; *(&x)是指x的值。

答案 2 :(得分: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));

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

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

这里s [i]将是值1234所在的地址。 可以说它是489000。 因此&amp; s [i]将是489000地址所在的地址。 可以说它是380000。 回想一下指针的概念。

所以&amp; s [i] + j将是“地址489000所居住的地址+ j”。 即; 380000 + J

我们在operator *上对我们得到的这个特定“地址”应用了一个值。 *(&安培; S [I] + j)的。 它变成了, 值为['地址489000所在的地址'+ j]。 值为[380000 + j]。

当i = 0,j = 0时,它将打印,值为[380000],即; 489000。

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