指向二维数组的指针

1、认识指向二维数组的指针

定义一个整型的二维数组:

        int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};

指向这个二维数组的指针定义为:

        int (*p)[4]=a;

来理解下  int (*p)[4] 这个定义形式:[]的优先级高于*,所以需要是 int (*p)[4] 而不是 int *p[4](这种形式为指针数组)。 int (*p)[4]即:*p表示这是一个指针,剩余的部分 int[4] 可以理解为一维数组,即a中所包含数据的类型。即这个指向二维数组的指针还可以理解为指向几个一维数组的指针。

2、使用指向二维数组的指针

那么怎么通过 int (*p)[4] 实现对a的使用呢?

p+i 表示指向第 i 行整行数据(从第零行开始)

*(p+i) 表示取第 i 行整行数据,也表示指向第 i 行的首地址

*(p+i)+j 表示指向第 i 行第 j 个数据的地址

*(*(p+i)+j ) 表示取第 i 行第 j 个数据的值

3、理解指向二维数组的指针

这个需要一层一层的理解,首先 p 是指向了二维数组 a 第零行的整行数据,即 a 中的{0,1,2,3},如果对 p 进行加减,那么所指的行数将发生变化,比如:p+1 指向了第一行,相应的 *(p+1) 就是对所指的第一行取数据,但要注意的是,取数据取的是整行的数据,但取整行的数据又没有意义,所以编译器会把取整行的数据转换为取行的首地址,例如 *(p+1) 就是取第一行第零个数据的地址,即 4 的地址。如果要取第一行第零个数据的数值,则需要再加一个 * ,即:**(p+1)。

如果我要取第一行第一个数据的值呢?书接上回, *(p+1) 表示的是取第一行第零个数据的地址,那么我再加1,就能实现在第一行第零个数据偏移一位,即 *(p+1)+1 就是取第一行第一个数据的地址,再加 *,就实现了取数值,即 *(*(p+1)+1) 就代表了数字5.

你可能感兴趣的:(C语言,c语言)