2013年(50)
分类: LINUX
2013-04-20 07:31:55
指针与多维数组
(主要指二维数组)
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
换个角度看世界:
如首行一样,将首行视为一个元素,一个特殊的元素,这个“特殊的”元素是一个一维数组。那么这个二维数组是由是由三个“特殊的”元素组成的一个“特殊的”一维数组。
a是这个“特殊的”一维数组的名称,也就是首地址,也就是第一个元素的地址,也就是第一行的首地址,是指首行一整行,并不是指某个具体元素。那么我们称之为“行指针”。同理:a+0,a+1,a+2,都是行指针。
结论:
表示形式 |
含义 |
指针类型 |
a或者a+0 |
指向第0行 |
行指针 |
a+1 |
指向第1行 |
行指针 |
a+2 |
指向第2行 |
行指针 |
接下来,我们来放大观看首行,首行的元素分别是:a[0][0],a[0][1],a[0][2],a[0][3]。将其看作一个独立的一维数组, 那么 a[0]就是这个数组的名称,也就是这个数组的首地址,也就是第一个元素的地址,也就是a[0]+0。a[0]和a[0]+0都是指具体的元素,那么我们 称之为“列指针”。
结论:(第0行视为一维数组)
表示形式 |
含义 |
指针类型 |
a[0] |
是一维数组的名称,也是它的首地址,而且是第1个元素的地址(a[0]+0) |
列指针 |
a[0]+1 |
第0行,第2个元素的地址 |
列指针 |
a[0]+2 |
第0行,第3个元素的地址 |
列指针 |
两个重要概念:行指针和列指针。
行指针:指的是一整行,不指向具体元素。
列指针:指的是一行中某个具体元素。
可以将列指针理解为行指针的具体元素,行指针理解为列指针的地址。
那么两个概念之间的具体转换是:
*行指针----列指针
&列指针----行指针
根据以上转换公式:
行指针 |
转换成:列指针 |
列指针等价表示 |
内容 |
内容等价表示 |
含义 |
a或a+0 |
*a |
a[0] |
*a[0] |
*(*a) |
a[0][0] |
a+1 |
*(a+1) |
a[1] |
*a[1] |
*(*(a+1)) |
a[1][0] |
a+2 |
*(a+2) |
a[2] |
*a[2] |
*(*(a+2)) |
a[2][0] |
对于元素a[1][2],其地址用列指针表示为a[1]+2,等价表示为*(a+1)+2,那么内容是*(*(a+1)+2);
列指针 |
行指针 |
等价表示 |
含义 |
a[0] |
&a[0] |
&a或&(a+0) |
第0行 |
a[1] |
&a[1] |
&(a+1) |
第1行 |
a[2] |
&a[2] |
&(a+2) |
第2行 |
示例1:用列指针输出二维数组。
#include
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p= a[0]; // 列指针的定义法
for(; p < a[0] + 12; p++)
{
printf("%d ",*p);
}
return;
}
示例2:用行指针输出整个二维数组。
#include
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4]= &a[0]; // 行指针定义法或者int (*p)[4]= a;
int i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
{
printf("%d ",*(*(p + i) + j));
}
return;
}