09.19 c語言指針和數組關係探究,小白也能看懂

本文通過示例代碼,給出我們對c語言中指針和數組之間關係的理解,希望對初學者有所幫助。

請看我們給出的精簡示例代碼:(測試環境:x86_64+gcc)

#include <stdio.h>int main(void) { int arr[2][3] = { {1, 2, 3}, {4, 5, 6} }; int *p1 = arr[0]; int (*p2)[3] = &arr[0]; int (*p3)[3] = arr; int (*p4)[3] = &(*arr); int (*p5)[3] = &arr[1]; int (*p6)[2][3] = &arr; /* base */ printf("p0 : %p\\n", arr); /* expect: add 4(1 * sizeof int) */ printf("p1+1 : %p\\n", p1 + 1); /* expect: add 12(3 * sizeof int) */ printf("p2+1 : %p\\n", p2 + 1); printf("p3+1 : %p\\n", p3 + 1); printf("p4+1 : %p\\n", p4 + 1); /* expect: add 24(6 * sizeof int) */ printf("p5+1 : %p\\n", p5 + 1); printf("p6+1 : %p\\n", p6 + 1); return 0;} /<stdio.h>


輸出結果如下:

p0 : 0x7fff4ddbb2b0p1+1 : 0x7fff4ddbb2b4p2+1 : 0x7fff4ddbb2bcp3+1 : 0x7fff4ddbb2bcp4+1 : 0x7fff4ddbb2bcp5+1 : 0x7fff4ddbb2c8p6+1 : 0x7fff4ddbb2c8


對上面代碼的理解是:

p1:類型就是int *,可以記為是一個零維指針類型,因為該指針指向的元素根本就不是一個數組p0/p2/p3/p4/p5,類型都是int (*)[3],可以記為一維指針類型,因為該指針指向的元素是一個一維數組p6,類型是int (*)[2][3],自然就應該記為是二維指針類型


可見,對於n-1維指針類型的指針,它的活躍範圍是一個n維數組。

指針的定義很單純,一個指針變量僅僅包含所指向數據的類型這麼一個簡單的屬性;而數組的定義就不一樣了,它承載了很多額外的屬性:(以int arr[X1][X2]...[Xn]為例)

&arr+i:類型是int (*)[X1]...[Xn],可以在1個arr[X1][X2]..[Xn]的n維數組之間挪動,所以&arr+1就會跳出arr的整個n維數組圍arr+i:類型是int (*)[X2]...[Xn],可以在X1個arr[X2]..[Xn]的n-1維數組之間挪動arr[i]:類型是int (*)[X3]...[Xn],固定到上述X1個arr[X2]..[Xn]的n-1維數組中的某一個,只活躍在其內部。也就是說,在X2個arr[X3]..[Xn]的n-2維數組之間挪動arr[i][j]:依此類推。。。


理解了這些,再回頭看本文給出的代碼示例,就很好理解了:

arr的類型是int (*)[3],&arr的類型是int (*)[2][3]arr[0]的類型是int *,&arr[0]的類型是int (*)[3]arr[0][0]的類型是int,&arr[0][0]的類型是int *


可以認為,數組定義一套自己的東西,但是留出了一個接口開放給指針。這樣,數組才得以以指針形式被訪問(使用)了。。。

觀眾老爺們沒事點個關注唄,每天給你分享簡單實用的乾貨!