一、列指針(豎為列)
1、列指針相關定義
列指針:被稱為是指針變量指向二維數組的某個元素
一般使用時會有如下定義:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p;
而上述代碼定義的指針p,一般按照下表方式指向二維數組a中的元素:
? ? ? ? ? ? ? ? ?語法 | ? ? ?樣例 | ? ? ? ? ? ? ? ? ? ? 說明 | |
指向任意元素 | 指針變量=&數組名[下標1][下標2] | p=&a[1][2] | p指向的元素為7 |
指向首元素 | 指針變量=&數組名[0][0] 指針變量=*二位數組名 | p=&a[0][0] 或p=*a | p指向首元素,即數值1所在的位置 |
當指針p指向二維數組a的首元素后,p+1指向第2個元素,p+2指向第三個元素,如下表:
p(對應的內容:1) | p+1(對應的內容:2) | p+2(對應的內容:3) | p+3(對應的內容:4) |
p+4(對應的內容:5) | p+5(對應的內容:6) | p+6(對應的內容:7) | p+7(對應的內容:8) |
p+8(對應的內容:9) | p+9(對應的內容:10) | p+10(對應的內容:11) | p+11(對應的內容:12) |
因為這種定義下的指針p,每執行加1操作后,將會指向下一列的一個元素,因此稱為“列指針”
2、列指針公式
當指針p指向了M行N列的二維數組a,則其中任意一個元素a[i][j]的相關信息可以表示為:
元素名稱 | 元素地址 | 元素內容 |
a[i][j] | p+i*N+j | *(p+i*N+j)? |
二、行指針(橫成行)
1、行指針相關定義
行指針:指針變量指向二維數組的某一行
一般使用時,有如下定義:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];//定義行指針,其“4”要和定義的二維數組的列數目“4”相同
p=a; //行指針p指向二維數組a的首行
對于行指針,可以按如下解釋理解:
可以將二維數組的首行視為一個特殊的元素,而這個特殊的元素其實就是一個一維數組。那么上述代碼定義的二維數組即為一個由三個特殊元素組成的“一維數組”。此時a即是這個一維數組的名稱,按照一維數組的定義及知識可得,a是這個一維數組的數組名,也是首地址,也就是第一個元素的地址,也就是第一行的首地址,指的是首行一整行。所以,a+0.a+1,a+2都是行指針。(橘黃色和橘黃色對應,綠色和綠色對應)
所以就有如下表格(描述指向各行的行指針):
表示方法 | 說明 | 指針類型 |
a或者a+0 | 指向第0行 | 行指針 |
a+1 | 指向第1行 | 行指針 |
a+2 | 指向第2行 | 行指針 |
有了行指針之后,我們以第0行為例,展開說明行里的各個元素的表示方法等:
表示方法 | 說明 | 指針類型 |
a[0] | 是一維數組名稱,首地址,第0個元素的地址(a[0]+0) | 列指針 |
a[0]+1 | 第0行,第1個元素 | 列指針 |
a[0]+2 | 第0行,第2個元素 | 列指針 |
a[0]+3 | 第0行,第3個元素 | 列指針 |
注:為了方便起見,我這里的元素排序從0開始,即第0個,第1個,與數組的下標對應。
2、行指針公式
當指針p指向了M行N列的二維數組a,則其中任意一個元素a[i][j]的相關信息可以表示為:
元素名稱 | 元素地址 | 元素內容 |
a[i][j] | *(a+i)+j或a[i]+j | *(*(a+i)+j)或*(a[i]+j) |
注:元素a[i][j]的地址可表示為a[i]+j,由于a[i]等價于*(a+i)(根據一維數組的定義可知),因此其地址可表示為*(a+i)+j。
至此,行指針與列指針的的區別介紹完畢!
?
三、列指針和行指針的聯系
先明白兩個前文說的兩個事情:
行指針:指的是一整行,不指向具體元素。
列指針:指的是二維數組中某一行的某個具體元素。
可以將列指針認為是行指針的具體元素,行指針是列指針的地址。
兩者間的具體轉化:
*行指針--->列指針
&列指針--->行指針
*是指針運算,&取址運算。*后面必須是指針變量,&后面則什么變量都可以。
行指針代碼:
#include<stdio.h>//行指針輸入8個元素,再輸出
int main()
{int a[2][4];//定義二維數組int i=0,j=0;int (*p)[4];//定義行指針p=a;//將行指針指向二維數組第0個元素int n=0;for(i=0;i<2;i++){for(j=0;j<4;j++){scanf("%d",*(p+i)+j);//輸入數字}}//p=a;for(i=0;i<2;i++){for(j=0;j<4;j++){printf("%2d",*(*(p+i)+j));//輸出n++;if(n%4==0)printf("\n");}}return 0;
}
參考:RockeyQin??行指針和列指針詳解