行指標和列指標詳解
主要指二維陣列
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 |
指向第 |
行指標 |
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行,第 |
列指標 |
兩個重要概念:行指標和列指標。
行指標:指的是一整行,不指向具體元素。
列指標:指的是一行中某個具體元素。
可以將列指標理解為行指標的具體元素,行指標理解為列指標的地址。
那麼兩個概念之間的具體轉換是:
*行指標----列指標
&列指標----行指標
根據以上轉換公式:
行指標 |
轉換成:列指標 |
列指標等價表示 |
內容 |
內容等價表示 |
含義 |
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;
}