指针初阶(数组指针与二维数组)

0.二维数组特性

        ①.存储格式

        二维数组,在存储空间内的存储顺序是连续存储,按行优先存。

        假设定义一个2X3的数组,其在存储空间的存储格式如下:

        ②.表示方法

        且二维数组还有一个特性,例如有二维数组 a[3][2] ,那么 a[0] 就代表第一行 a[0][0] 的地址,a[1] 就代表第二行 a[1][0] 的地址。

        既然知道了每行数组的首地址是 a[0] 、a[1] 、a[2],那么表示每一行的后面几个元素就再加一个偏移量。a[0] 表示第一行首个元素的地址,那么在首个地址上加一个偏移量 a[0][1] ,就代表了那一行的后面的元素。

        注:a[0] 、 a[1] 、a[2] 表示该行元素的首地址,是一个一级指针

        ③.数组名的含义

        前面说到了,若定义了一个二维数组 int a[3][2] ; 其中 a[0] (即(a + 0))代表第一行的首地址,a[1] (即(a + 1))代表第二行的首地址,a[2]((a + 2)) 代表第三行的首地址;

        可见,对于二维数组来说,a 代表的是该数组的首地址(又称:行指针)其步长为 一行 !

一.用一阶指针表示二维数组

        若定义一个一阶指针,指向数组 a[3][2] ,则该一阶指针是这么表示二维数组的:

其指针 p 的步长为 4个字节 :(int)类型的大小。

        可见,一阶指针和二阶指针的步长是不一样的

三.行指针(数组指针)

1.行指针定义

        定义一个指针,使其指向一个二维数组。

        int (*p)[3] ,其中的 [3] 表示该指针的步长为 3 个 int (一行),则 p 的类型为 int (*)[3]

/* 二维数组 */
int a[2][3];

/* 行指针、其中 [3] 代表该指针的步长为(三个int) */
int (*p)[3];    

/* 使 p 指向数组 a */
p = a;

2.使用行指针表示数组元素

①.行指针偏移量 - a[][]

a[1] 表示第二行 ,在加一个偏移量 [1] 表示第二行的第二个数据。

    int a[3][2] = {{1,6},{9,12},{61,12}};
    int (*p)[2];

    p = a;

    printf("a[1][1]:%d\n",a[1][1]);
    printf("a[1][1]:%d\n",p[1][1]);

②.行指针降阶 - *(*(a + 1) + 1)

        (1)首先 (a + 1) 表示该二维数组的第二行,在 a 这个二阶指针上 + 1 ,步长为(一行)

        (2)*(a + 1) 表示将该地址降阶为了一阶指针(二阶指针解引用,变为一阶指针)

        (3)*(a + 1) + 1 表示该一阶指针移动一个步长(int),对应了 a[1][1] 的地址

        (4)*(*(a + 1) + 1) 最后将该元素的地址进行解引用,得到数据

    int a[3][2] = {{1,6},{9,12},{61,12}};
    int (*p)[2];

    p = a;

    printf("a[1][1]:%d\n",*(*(a + 1) + 1));
    printf("a[1][1]:%d\n",*(*(p + 1) + 1));

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值