C 指向数组元素地址的指针

C 指向数组元素地址的指针,c,arrays,pointers,multidimensional-array,addressof,C,Arrays,Pointers,Multidimensional Array,Addressof,正如我们所知,*(&Variable)将打印变量的值,但当我们在上述程序中实现相同的概念时 1234,56 1212,33 1434,80 1312,78 ints[4][2]={ {1234,56}, {1212,33}, {1434,80}, {1312,78} }; int i,j; 对于(i=0;i您的数组是二维的。因此,s[i]是行i的地址(即s[i]类型是int*),而&s[i]是地址的地址(即int**类型)。在其上应用*时,您会得到一个地址(即int*) 的确,运算符&表示“的

正如我们所知,
*(&Variable)
将打印变量的值,但当我们在上述程序中实现相同的概念时

1234,56
1212,33
1434,80
1312,78
ints[4][2]={
{1234,56},
{1212,33},
{1434,80},
{1312,78}
};
int i,j;

对于(i=0;i您的数组是二维的。因此,
s[i]
是行
i
的地址(即
s[i]
类型是
int*
),而
&s[i]
是地址的地址(即
int**
类型)。在其上应用
*
时,您会得到一个地址(即
int*


的确,运算符
&
表示“的地址,
*(&x)
表示
x
的值。您的数组是二维的。因此,
s[i]
是行
i
的地址(即
s[i]
类型为
int*
),而
&s[i]
是地址的地址(即类型为
int**
)。当您在其上应用
*
时,您将获得一个地址(即
int*


的确,运算符
&
表示“的地址,
*(&x)
表示
x
注意这里的
s
是一个二维数组,在某些情况下,数组名衰减为指向第一个元素的指针

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

然后,引用第§6.3.2.1章中的
C11

除非它是
sizeof
运算符、
\u Alignof
运算符或 一元
&
运算符,或是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值。[…]

因此,

  • 在第一种情况下

    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[i]
    的类型为
    int[2]
    ,它衰减为
    int*
    ,用于指针算术,产生另一个
    int*
    。解引用后,得到一个
    int

  • 在第二种情况下

    *(s[i]+j)
    
    由于上述相同的原因,在
    &s[i]
    的情况下,
    s[i]
    不会衰减,类型是“指向
    int[2]
    ,指针算法会对其起作用。因此,在这种情况下,加法的结果也是“指向
    int[2]
    ”在最后的解引用之后,它变成
    int*
    ,这是
    %d
    的不匹配,这是编译器报告的


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

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

然后,引用第§6.3.2.1章中的
C11

除非它是
sizeof
运算符、
\u Alignof
运算符或 一元
&
运算符,或是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值。[…]

因此,

  • 在第一种情况下

    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[i]
    的类型为
    int[2]
    ,它衰减为
    int*
    ,用于指针算术,产生另一个
    int*
    。解引用后,得到一个
    int

  • 在第二种情况下

    *(s[i]+j)
    
    由于上述相同的原因,在
    &s[i]
    的情况下,
    s[i]
    不会衰减,类型是“指向
    int[2]
    ,指针算法会对其起作用。因此,在这种情况下,加法的结果也是“指向
    int[2]
    ”在最后的解引用之后,它变成
    int*
    ,这是
    %d
    的不匹配,这是编译器报告的


    • 第一种情况

      你的打印声明是这样的

      *(&s[i]+j)
      
      printf("%d  ",*(s[i]+j));
      
      这里的s[i]+j是地址

      让我们考虑i=0,j=1,第一i循环,第二j循环。< /p> 这里的s[i]将是值1234所在的地址。假设它是489000。 所以s[i]+j,这里s[0]+1将是值56所在的地址。假设它是489004

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

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

      *(&s[i]+j)
      
      printf("%d  ",*(s[i]+j));
      
      这里&s[i]+j是地址

      让我们考虑i=0,j=0,第一i循环,第一j循环。< /p> 这里s[i]将是值1234所在的地址。 假设是489000。 So&s[i]将是地址489000所在的地址。 假设是38万。 回想一下指针的概念

      So&s[i]+j将是“地址489000居住的地址+j”。 ie;380000+j

      我们在运算符*处对我们得到的这个特定“地址”应用一个值。 *(&s[i]+j)。 就变成了,, ['地址489000所在的地址'+j]处的值。 [380000+j]处的值

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


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

      第一种情况

      你的打印声明是这样的

      *(&s[i]+j)
      
      printf("%d  ",*(s[i]+j));
      
      这里的s[i]+j是地址

      让我们考虑i=0,j=1,第一i循环,第二j循环。< /p> 这里的s[i]将是值1234所在的地址。假设它是489000。 所以s[i]+j,这里s[0]+1将是值56所在的地址。假设它是489004

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