數組在不少狀況下是和指針等價的,數組的下標運算和指針的解引用也有等價形式:arr[i] == *(arr + 1);可是也有一些狀況下數組和指針是不同的:extern int arr[]; extern int *arr;編程
這裏持續記錄一下指針和數組的異同(如下來自於C專家編程)數組
首先明確一下幾個定義:數據結構
定義 | 只能出如今一個地方 | 肯定對象的類型並分配內存,用於建立新的對象。例如:int my_array[100] |
聲明 | 能夠屢次出現 | 描述對象的類型,用於指代其餘地方定義的對象(例如在其餘文件裏)例如:extern int my_array[] |
注:C語言引入了"可修改的左值"這個術語,可修改的左值指的是能夠放在賦值語句左邊。這個術語是爲了與數組名區分,數組名也用於肯定對象在內存中的位置,也是左值,但它不能做爲賦值的對象。所以,數組名是個左值但不是可修改的左值。函數
下面繼續對數組和指針進行解釋:"當定義爲指針,但以數組方式引用"時會發生什麼spa
對照上圖的訪問方式:
char *p = "abcdefg"; ...... p[3]
和
char a[] = "abcdefg"; ...... a[3]
這兩種狀況均可以取得字符'd',但二者的途徑卻很不同。3d
當寫了extern char *p的時候,編譯器將會:
a.取得符號表中p的地址,提取存儲於此處的指針
b.把下標所表示的偏移量與指針的值相加,產生一個地址
c.訪問上面這個地址,取得字符。指針
數組和指針的其餘區別對象
指針 | 數組 |
保存數據的地址 | 保存數據 |
間接訪問數據,首先取得指針的內容,把它做爲地址,而後從這個地址提取數據。blog 若是指針有一個下標[I],就把指針的內容加上I做爲地址,從中提取數組內存 |
直接訪問數據,a[I]只是簡單的一a + I爲地址取得數據 |
一般用於動態數據結構 | 一般用於存儲固定數目且數據類型相同的元素 |
相關的函數爲malloc(),free() | 隱式分配和刪除 |
一般指向匿名數據 | 自身即爲數據名 |
2.數組和指針的相同點:
除了上面的幾種不一樣的狀況之外,不少狀況下數組和指針是能夠等同看待的,例如在做爲函數的形參的時候,數組和指針是等價的:void foo(int *); == void foo(int[]);
不少狀況下咱們使用數組和指針的時候也是很是相似的,例如 arr[n] == *(arr + n)