指针与多维数组
(主要指二维数组)
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 <stdio.h>
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 <stdio.h>
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;
}