參考資料:html
數組:能用索引訪問的同質元素連續集合(內存連續)git
咱們能夠把數組下標用在指針上,即:
*(p + i)
等價於 p[i]
github
指針的加減運算對於數組一樣實用,即數組名加減整數:
*(p + i)
等價於 *(array + i)
編程
1.array[i]
與 *(array+i)
結果相同,生成的機器碼卻不一樣(存在異議,待修正)數組
array[i]
:從 array
位置開始,移動 i
個位置,再取出內容*(array+i)
:從 array
位置開始,在地址上增長 i
,而後取出這個地址中的內容2.sizeof
操做符對他們的操做不一樣
有代碼例如3d
int array[5] = {1,2,3,4,5}; int *p = array;
則指針
sizeof(array)
:返回20,即數組分配的字節數 4X5sizeof(p)
:返回4,即指針長度int (*p)[4]
,p
即爲指向數組的指針有代碼以下:code
int array[3][4]; int (*p)[4]; p = array;
p
與 p+1
與 ++p
:p
是一個int型數組(長度4)的指針,p+1
是另外一個int型數組(長度爲4)的指針,經過一個 p
能夠讀取 array[]
的內容,++p
同理
htm
p
讀取 array[0]
:當數據類型匹配時,能夠理解爲 *p
內的 *p+0,*p+1,*p+2,*p+3
對應讀取array[0][1],array[2]...
blog
p+1
讀取 array[1]
:當數類型匹配時,同理讀取 array[1]
的內容
當 *p
與 array[]
數據類型不匹配:即array[3][4]
與 (*p)[5]
,由於*p
爲5個int的數組,在p
讀取array[0]
時,*p+4
佔據了 array[1][0]
,在p+1
讀取array[1]
時,則從array[1][1]
開始讀取,產生其餘結果,但這並不算錯誤,而是警告[Warning] assignment from incompatible pointer type [-Wincompatible-pointer-types]
。同理,當*p
內元素少於數組,則提早讀取
總結(前提爲數據類型匹配):
p+i 與 *p+i
:一個指向第 i
數組首位元素,一個指向 1
數組的第i
個元素*p[n] 與 (*p)[n]
:優先級() > [] > *
,一個是p[n][0]/array[n][0]
,一個爲p[0][n]/array[0][n]
代碼示例:數組指針.c
int *p[4]
p
是指向 int 的指針的數組(元素個數4)。指針數組中的每個元素均爲指針有代碼以下:
#define Len 5 char *p1[Len] = {"ONE","TWO","THREE","FOUR","FIVE"}; char var[Len][6] = {"one","two","three","four","five"}; char *p2[Len];
var
:當定義了一個二維數組後,不管賦不賦值,系統都會給它分配固定的空間,並且該空間必定是連續的。咱們能夠經過指定下標對其元素進行修改p1
:建立指針數組後,分配的空間則取決於具體字符串的長度,但該空間不必定是連續的,且不能經過下標對其元素進行修改var
內個元素大小取決於最長元素(three\0)
爲6字節,故總大小 5x6=30,此外,對指針數組 p1
元素進行sizeof()
實計算的是 int *
,故總大小爲 5x4=20\0
填充,var
內的剩餘空間亦是