无法理解数组的行为

Abh*_*bey 3 c arrays

我有以下代码:

 #include<stdio.h>
   void func(int [][3]);

   int main(){
           int a[][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
           func(a);
           printf("%d", a[2][1]);
   }       

  void func(int b[][3]){
          ++b;
          b[1][1] = 17;
  }
Run Code Online (Sandbox Code Playgroud)

问题:
我希望printf语句打印8但是打印17.
我不明白为什么?

谢谢

Yu *_*Hao 7

需要注意++bfunc(),在此之后,b(最初指向a[0][0]),现在指向a[1][0],所以下面

b[1][1] = 17;
Run Code Online (Sandbox Code Playgroud)

a[2][1]在外面修改.


dmi*_*nov 5

您可以使用扩展代码查看代码的内存布局:

     #include <stdio.h>

     void print_addr(int b[][3])
     {
        for (int i = 0 ; i < 3 ; i++) {
           for (int j = 0 ; j < 3 ; j++)
              printf("%p ", &b[i][j]);
           printf("\n");
        }

     }

     void func(int b[][3]){
        print_addr(b);
        printf("sizeof(b): %d   sizeof(b[0][0]) %d\n", sizeof(b), sizeof(b[0][0]));
        ++b;
        print_addr(b);
        b[1][1] = 17;
     }

     int main()
     {
        int a[][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
        func(a);
        printf("%d\n", a[2][1]);
     }       
Run Code Online (Sandbox Code Playgroud)

它将显示在您进行移位后,b[1][1]地址将指向a[2][1]单元格,因为b它是指向数组行的指针并向下b++移动一行.

你也可以通过指针传递值,因此函数func访问位于相同的内存a.

如果我建议,只需在学习的同时打印所有内容,并查看这个精彩的演示文稿:http://www.slideshare.net/olvemaudal/deep-c?qid = 1fcb7c99-e916-4bcd- baa2-1a1f974d1c68