1. 程式人生 > >行指標和列指標詳解

行指標和列指標詳解

主要指二維陣列

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個元素的地址

列指標

兩個重要概念:行指標和列指標。

行指標:指的是一整行,不指向具體元素。

列指標:指的是一行中某個具體元素。

可以將列指標理解為行指標的具體元素,行指標理解為列指標的地址。

那麼兩個概念之間的具體轉換是:

*行指標----列指標

&列指標----行指標

根據以上轉換公式:

行指標

轉換成:列指標

列指標等價表示

內容

內容等價表示

含義

aa+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;

}