指針與多維數組
(主要指二維數組)
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;
}