C语言的行指针和列指针

一、定义二维数组
<1>定义方式
数据类型 数组名[行数][列数];

例如:
int a[3][4]; =====>3行4列

C语言对二维数组采用的这种特殊的定义方式,使得二维数组可以被看作一种特殊的一维数组:它的元素又是一个一维数组。例如:
上图中的a可以看出是一个一维数组,他有3个元素:
a[0],a[1],a[2].
每个元素又包含四个一维数组。
a[0]----------->a[0][0] a[0][1] a[0][2] a[0][3]
a[1]----------->a[1][0] a[1][1] a[1][2] a[1][3]
a[2]----------->a[2][0] a[2][1] a[2][2] a[2][3]

这里的a[0],a[1],a[2]我们把它叫做列指针。它指向了第一个元素的地址。
我曾经说过,一维数组的数组名就就数组首元素的首地址。
因此,这里我们
a[0]就指向了a[0][0]的首地址。
a[1]就指向了a[1][0]的首地址。
a[2]就指向了a[2][0]的首地址。
a[0] =======>&a[0][0]
a[1] =======>&a[1][0]
a[2] =======>&a[2][0]

注:a[0][0] 为一个int类型的数据,故我们的a[0]要用一个int *类型的指针来保存。
因此,列指针是一个一级指针类型。
以上的分析是针对我们的a[0],a[1],a[2]中子元素来分析。下面,我们来对我们的
二维数组的首元素a来说。它拥有三个元素a[0],a[1],a[2]。

我们可以用以下方式来访问者三个变量。
a >&a[0]
a + 1
=>&a[1]
a + 2 ======>&a[2]

这里的a[0],a[1],a[2]都是指针常量,我们对常量取地址的话,相当与对整个数组的取大小。
故a是一个数组指针类型。这里的a,我们叫做行指针。

结论:行指针是一个数组指针类型。
下面我们来说说二维数组的特点:
(1)数组名标示数组的首地址
(2)二维数组的数组名是数组指针类型
(3)二维数组按行优先存放

综上所述,我们有了一个结论:
行指针类型:a , a + 1,a + 2----->加 + 1,移动一行元素的大小,它实质是一个数组
指针的类型。例如:int (*p)[2]
列指针类型:a[0],a[1],a[2] ->加1移动一个数据元素的大小,它实质是一个一维指针的类型。
例如:int *p;

行列指针变换的特点:
行指针 + *》列指针
a >&a[0] *a <
>*(&a[0]) <
=>a[0]
a + 1
===>&a[1] *(a + 1) <=> *(&a[1] )<=> a[1]
a + 2 >&a[2] *(a + 2) <=> *(&a[2]) <=======>a[2]

列指针 + &========》行指针
&a[0] ============>a
&a[1] >a + 1
&a[2]
>a + 2

思考:
int a[3][2];
a[1][1]这个元素的几种表示方式?
*(*a + 1 * 2 + 1) , *(a[1] + 1) , ((a + 1) + 1), *(&a[1][1])

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值