任何能由數組下標完成的操作也可由指針來完成,一個不帶下標的數組名就是一個指向此數組的指針,在 C 語言中數組名就是數組的地址。當一個指針變量被初始化為數組名時,就說該指針變量指向了數組。
char str[20],*pstr;
pstr=str 等價于 pstr =&str[0] ; // 指針被置為數組第一個元素的地址
訪問數組第 6 個元素: str[5],pstr[5], *(str+5),*(pstr+5) 。
值得注意的是 pstr 是一個可以變化的指針變量,因此 pstr++;++pstr; pstr+=5 都是正確的,而 str 是一個常數。因為數組一經說明,數組的地址也就被固定了,故 str++;++str; str+=5 都是錯誤的。
編譯系統在處理 str[i] 時,實際上是將數組元素的形式 str[i] 轉換為 *(str+i) ,然后再進行運算的。相應的引用二維數組 a[i][j] 則等價于 (*(a+i))[j] 或 *(*(a+i)+j), 通常式子 *(a+i)+j 是用來計算元素所在內存地址,并不是它的內容。
int a[3][4]; // 二維整型數組
int (*p)[4]; // 整型指針數組
p=a;
則 p+1 不是指向 a[0][1] ,而是指向 a[1] 。這是 p 的增值以一維數組長度為單位。
假設是這么一個數組:
int arr[20];
則 arr 的內存示意圖為:
和指針變量相比, 數組沒有一個單獨的內存空間而存放其內存地址。即:指針變量 p 是一個獨立的變量,只不過它的值指向另一段連續的內存空間;而數組 arr ,本身代表的就是一段連續空間。
如果拿房間來比喻。指針和數組都是存放地址。只不過,指針是你口袋里的那本通訊錄上寫著的地址,你可以隨時改變它的內容,甚至擦除。而數組是你家門楣上釘著的地址,你家原來是“復興路甲 108 號”,你絕對不能趁月黑天高,把它涂改為“唐寧街 10 號”。
數組是“實”的地址,不能改變。當你和定義一個數組,則這個數組就得根據它在內存中的位置,得到一個地址,如上圖中的“ 0x1A000000 ”。只要這個數組存在,那么它終生的地址就是這個值。
指針是一個“虛”的地址,可以改變地址的值。當你定義一個指針變量,這個變量占用 4 個字節的內存,你可以往這 4 字節的內存寫入任意一個值,該值被當成一個內存地址。比如,你可以寫入上面的“ 0x1A000000 ” , 此時,指針 p 指向第一個元素。也可以改為“ 0x1A000003 ”,此時,指針 p 指向第二個元素。
參考:
《 指 針 》
《 A TUTORIAL ON POINTERS AND ARRAYS IN C 》
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
