指針與數組

參考資料: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,即數組分配的字節數 4X5
  • sizeof(p):返回4,即指針長度

數組指針(行指針)

  • 定義:指的是數組名的指針數組首元素地址的指針指向數組的指針。例:int (*p)[4]p 即爲指向數組的指針
  • 聲明解釋:定義一個 指向整數型的一維數組(長度爲n) 的指針
  • 本質:指針

有代碼以下:code

int array[3][4];
int (*p)[4];
p = array;

pp+1++pp 是一個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]的內容

*parray[]數據類型不匹配:即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 內的剩餘空間亦是
  • 代碼示例:指針數組.c
相關文章
相關標籤/搜索