Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何及;a[i][j]的计算结果为*(a+;i)+;J_Arrays_C_Pointers - Fatal编程技术网

Arrays 如何及;a[i][j]的计算结果为*(a+;i)+;J

Arrays 如何及;a[i][j]的计算结果为*(a+;i)+;J,arrays,c,pointers,Arrays,C,Pointers,a[3][3]={1,2,3,4,5,6,7,8,9} 如果我想使用*(a+I)+j获得[2][3]的地址 根据我的说法,*(a+2)将给我3(考虑行顺序)和j=3,因此它的计算结果为3+3=6 它将如何给出地址?只需删除j(3)并将3添加到i。无需添加j*a是数组第一个元素的地址**a=1,所以*a+2表示将2添加到第一个元素的地址,它将成为第三个元素的地址*(a+5)是a[2][3]的地址。你的作业也应该是a[3][3]={{1,2,3},{4,5,6},{7,8,9}正如您显然知道的,&a

a[3][3]={1,2,3,4,5,6,7,8,9}

如果我想使用*(a+I)+j获得[2][3]的地址

根据我的说法,*(a+2)将给我3(考虑行顺序)和j=3,因此它的计算结果为3+3=6


它将如何给出地址?

只需删除j(3)并将3添加到i。无需添加j*a是数组第一个元素的地址**a=1,所以*a+2表示将2添加到第一个元素的地址,它将成为第三个元素的地址*(a+5)是a[2][3]的地址。你的作业也应该是a[3][3]={{1,2,3},{4,5,6},{7,8,9}

正如您显然知道的,
&a[2][3]
被定义为
*(a+2)+3
。下面是该表达式的计算方式:

  • a
    是一个由3个数组组成的数组,其中3个
    int
    a
    的元素有
    a[0]
    a[1]
    a[2]
  • 在表达式
    a+2
    中使用
    a
    时,
    a
    自动转换为指向其第一个元素的指针。所以
    a
    变成
    &a[0]
    ,一个指向
    a[0]
    的指针
  • 根据指针的
    +
    定义,将
    2
    添加到指向
    a[0]
    的指针会生成指向
    a[2]
    的指针。所以
    a+2
    就是
    &a[2]
  • 然后
    *(a+2)
    a+2
    指向的对象,因此它是
    a[2]
  • 所以
    *(a+2)+3
    就是
    a[2]+3
  • a[2]
    是一个由3
    int
    组成的数组。It元素有
    a[2][0]
    a[2][1]
    a[2][2]
  • 在表达式
    a[2]+3
    中,
    a[2]
    自动转换为指向其第一个元素的指针。因此
    a[2]
    变成
    &a[2][0]
    ,表达式是
    &a[2][0]+3
  • 根据指针
    +
    的定义,将
    3
    添加到指向
    a[2][0]
    的指针将生成指向
    a[2][3]
    的指针。没有元素
    a[2][3]
    ,但是指针算法允许超出数组的末尾。您可以使用该指针作为端点,尽管那里没有定义的元素,并且您不应该取消对指针的引用
  • 因此
    *(a+2)+3
    给出的地址正好超出子数组的末尾
    a[2]

    简单-如果

    a[i] == *(a + i)
    
    然后

    所以

    &a[i][j] == *(a + i) + j
    

    表达式
    a[i]
    的类型为“int的三元素数组”。除非它是
    sizeof
    或一元
    &
    运算符的操作数,否则它将被转换或“衰减”为类型“指向
    int
    ”或
    int*
    。因此,
    a[i]+j
    给你一个指针值,而不是整数值。

    你确定要a[2][3]的地址吗?这是越界的,因为在C中,索引从0开始,而不是从1开始,我想要一个[1][2],所以在2d数组中,a[2]将充当指向a[2]行第一个元素的数组指针,也就是说,根据你的说法,*(a+2)+3是[2]+3,那么*(a+2)+3将如何给出地址?@Pranjalakg:在第5步,
    *(a+2)+3
    显示为
    a[2]+3
    。在步骤7中,
    a[2]
    被转换为
    &a[2][0]
    ,因此我们有
    &a[2][0]+3
    ,这是一个地址加上一个整数。在第8步中,这个加法产生了
    a[2][3]
    的地址。非常感谢,但根据第8步(a+2)+3应该给出的地址不是*(a+2)+3,也就是我唯一的最后一个疑问?@Pranjalakg:In
    *(a+2)+3
    *(a+2)
    是数组
    a[2]
    ,它会自动转换为
    &a[2][0]/code>,然后加上3就得到了
    &a[2][3]
    。在
    (a+2)+3
    中,
    a
    &a[0]
    ,因此
    a+2
    &a[2]
    ,然后
    (a+2)+3
    将是
    &a[2]+3
    ,这将是
    &a[5]
    ,这是无效的,因为它超出了
    a
    的末尾。
    &a[i][j] == *(a + i) + j