二级指针偏移

#include <stdio.h>
void test_fuc(int b[][3])
{
    ++b;
    b[1][1]=820;
}
int main(void)
{
    int a[][3]={
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
   test_fuc(a);
   printf("a[2][1]=%d
",a[2][1]);
    return 0;
}

输出:

数组当做函数参数的时候,会退化成指针,但是只退化一次,int b[][3]作为参数会变成(*b)[3];b是一个指针,指向一个数组,数组含有3个int类型的元素。++b之后,注意我们b的类型,一旦移动一个步长,相当于移动3个int位置,所以++b之后,b指向的是a[1][0];然后b[1][1];相当于b又移动了1个步长,即移动3个int位相当于对应a[2]了,在b[1]的基础上,再使用[1],相当于对应a[2][1];所以最后打印a[2][1]等价于b[1][1].

平时我们习惯使用[]这样的下标运算代替指针运算,但是我们要清楚一个道理,b[1][1]等价于*(*(b+1)+1).

原文地址:https://www.cnblogs.com/yangguang-it/p/7401314.html