C語言基礎:指針數組與數組指針

一、指針數組

在這一節中我們來學習一個數組,這個數組比較特殊,也比較普通。說它特殊是因為這個數組是指針的數組,也就是說我們有一個數組,這個數組裡存放的變數類型是指針型變數;說它普通是因為數組變數其實與其它普通變數沒有什麼區別,指針變數就是一種可以存放內存地址的變數,所以它們也可以被定義成一串連續的變數集合,這個集合就是指針數組。例如,我們可以定義一組變數,這組變數就是一個數組,共有4個元素,而每一個元素都是一個指向int型變數的指針:

int a = 0;int b = 1;int c = 2;int d = 3;int *p[4];p[0] = &a;p[1] = &b;p[2] = &c;p[3] = &d;printf("%d
", *p[0]);printf("%d
", *p[1]);printf("%d
", *p[2]);printf("%d
", *p[3]);

在這裡我們要注意一下運算符的優先順序,由於 * 的優先順序比 [] 的優先順序低,所以整個表達式中p要先與[4]做結合表示的是一個數組,再與 * 結合表示每一個數組元素的類型是一個指針變數。我們再來看一看多維數組與多維指針數組:

int array[2][3] ={ { 0, 1, 2 }, { 3, 4, 5 }};int *p[2][3];for (int i = 0; i < 2; i++){ for (int j = 0; j < 3; j++) { p[i][j] = &array[i][j]; }}for (int i = 0; i < 2; i++){ for (int j = 0; j < 3; j++) { printf("%d ", *p[i][j]); } printf("
");}

值得注意的地上是多維數組表示的是整型多維數組表示的是很數組中每一個元素的類型都 是型型的變數,而多維指針數組中表示的是數組中每一個元素的類型都是指針型變數。而在循環賦值時我們將數組指針數組中的每一個指針都指向了整型數組中的每一個元素。

二、指針數組與數組指針

接下來我們來看一看一個非常容易混淆的兩個概念:「指針數組」與「數組指針」。

指針數組:表示的是一個數組,數組中每一個變數都是指針型變數;

數組指針:表示的是一個指針類型的變數,這個指針變數指向的是一個數組。

我們用一個例子來仔細對它們的區別做說明:

int array[2][3] ={ { 0, 1, 2 }, { 3, 4, 5 } };//指針數組int *p[2][3];for (int i = 0; i < 2; i++){ for (int j = 0; j < 3; j++) { p[i][j] = &array[i][j]; }}for (int i = 0; i < 2; i++){ for (int j = 0; j < 3; j++) { printf("%d ", *p[i][j]); } printf("
");}//數組指針int (*q)[3] = array;for (int i = 0; i < 2; i++){ for (int j = 0; j < 3; j++) { printf("%d ", q[i][j]); } printf("
");}

對於上面程序中兩種不同的指針數組和數組指針請大家一定要分清。int *p[2][3];所表示的是一個二維數組,數組的每一個元素都是一個指針變數。也就是說,這是一個具有6個指針型變數的數組;而int (*q)[3] = array;所表示的是數組指針,注意:這裡只定義了一個指針型變數q,它指向一個二維數組array。而對於q來說,它告訴編譯器,這是一個指針,這個指針指向一個具有3列的數組變數。

關於這兩個概念不太容易理解,請大家自己動手編寫相關的程序,通過編寫程序、查看其運行結果來慢慢消化這兩個概念,並熟練掌握它們的原理與用法。

歡迎關注公眾號:編程外星人

推薦閱讀:

TAG:編程 | C編程語言 | 編程語言 |