gpt4 book ai didi

c - 指向数组元素地址的指针

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:57 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. [...]

因此,

  • 在第一种情况下,

    *(s[i]+j)

    s[i]int [2] 类型,衰减为 int *,用于指针运算,产生另一个 int *。取消引用后,您会得到一个 int

  • 在第二种情况下,

    *(&s[i]+j)

    由于上述相同的原因,在 &s[i] 的情况下,s[i] 不会衰减,并且类型是“指向 int [2] 的指针”,指针算术在其上运行。所以,在这种情况下,加法的结果也是“指向int [2]的指针”,在最后的解引用之后,变成了int *,这就是不匹配对于 %d,这是您的编译器报告的内容。

关于c - 指向数组元素地址的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com