C說話 數組指針詳解及示例代碼。本站提示廣大學習愛好者:(C說話 數組指針詳解及示例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話 數組指針詳解及示例代碼正文
數組(Array)是一系列具有雷同類型的數據的聚集,每份數據叫做一個數組元素(Element)。數組中的一切元素在內存中是持續分列的,全部數組占用的是一塊內存。以int arr[] = { 99, 15, 100, 888, 252 };為例,該數組在內存中的散布以下圖所示:
界說數組時,要給出數組名和數組長度,數組名可以以為是一個指針,它指向數組的第 0 個元素。在C說話中,我們將第 0 個元素的地址稱為數組的首地址。以下面的數組為例,下圖是 arr 的指向:
上面的例子演示了若何以指針的方法遍歷數組元素:
#include <stdio.h> int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int len = sizeof(arr) / sizeof(int); //求數組長度 int i; for(i=0; i<len; i++){ printf("%d ", *(arr+i) ); //*(arr+i)等價於arr[i] } printf("\n"); return 0; }
運轉成果:
99 15 100 888 252
第 4 行代碼用來求數組的長度,sizeof(arr) 會取得全部數組所占用的字節數,sizeof(int) 會取得一個數組元素所占用的字節數,它們相除的成果就是數組包括的元素個數,也即數組長度。
第 8 行代碼中我們應用了*(arr+i)這個表達式,arr 是數組名,指向數組的第 0 個元素,表現數組首地址, arr+i 指向數組的第 i 個元素,*(arr+i) 表現取第 i 個元素的數據,它等價於 arr[i]。
arr 是int*類型的指針,每次加 1 時它本身的值會增長 sizeof(int),加 i 時本身的值會增長 sizeof(int) * i,這在《指針變量的運算》中曾經停止了具體講授。
我們也能夠界說一個指向數組的指針,例如:
int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;
arr 自己就是一個指針,可以直接賦值給指針變量 p。arr 是數組第 0 個元素的地址,所以int *p = arr;也能夠寫作int *p = &arr[0];。也就是說,arr、p、&arr[0] 這三種寫法都是等價的,它們都指向數組第 0 個元素,或許說指向數組的開首。
假如一個指針指向了數組,我們就稱它為數組指針(Array Pointer)。
須要留意是,數組自己沒有類型,數組元素才有類型,p 指向的數組元素是 int 類型,所以 p 的類型必需也是int *。
反過去想,p 其實不曉得它指向的是一個數組,p 只曉得它指向的是一個整數,畢竟若何應用 p 取決於法式員的編碼。
更改下面的代碼,應用數組指針來遍歷數組元素:
#include <stdio.h> int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int i, *p = arr, len = sizeof(arr) / sizeof(int); for(i=0; i<len; i++){ printf("%d ", *(p+i) ); } printf("\n"); return 0; }
數組在內存中只是數組元素的簡略分列,沒有開端和停止標記,在求數組的長度時不克不及應用sizeof(p) / sizeof(int),由於 p 只是一個指向 int 類型的指針,編譯器其實不曉得它指向的究竟是一個整數照樣一系列整數(數組),所以 sizeof(p) 求得的是 p 這個指針變量自己所占用的字節數,而不是全部數組占用的字節數。
也就是說,依據數組指針不克不及逆推出全部數組元素的個數,和數組從哪裡開端、到哪裡停止等信息。
上節我們講到,對指針變量停止加法和減法運算時,是依據數據類型的長度來盤算的。假如一個指針變量 p 指向了數組的開首,那末 p+i 就指向數組的第 i 個元素;假如 p 指向了數組的第 n 個元素,那末 p+i 就是指向第 n+i 個元素;而不論 p 指向了數組的第幾個元素,p+1 老是指向下一個元素,p-1 也老是指向上一個元素。
更改下面的代碼,讓 p 指向數組中的第二個元素:
#include <stdio.h> int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int *p = &arr[2]; //也能夠寫作 int *p = arr + 2; printf("%d, %d, %d, %d, %d\n", *(p-2), *(p-1), *p, *(p+1), *(p+2) ); return 0; }
運轉成果:
99, 15, 100, 888, 252
引入數組指針後,我們就有兩種計劃來拜訪數組元素了,一種是應用下標,別的一種是應用指針。
1) 應用下標
也就是采取 arr[i] 的情勢拜訪數組元素。假如 p 是指向數組 arr 的指針,那末也能夠應用 p[i] 來拜訪數組元素,它等價於 arr[i]。
2) 應用指針
也就是應用 *(p+i) 的情勢拜訪數組元素。別的數組名自己也是指針,也能夠應用 *(arr+i) 來拜訪數組元素,它等價於 *(p+i)。
不論是數組名照樣數組指針,都可使用下面的兩種方法來拜訪數組元素。分歧的是,數組名是常量,它的值不克不及轉變,而數組指針是變量(除非特殊指明它是常量),它的值可以隨意率性轉變。也就是說,數組名只能指向數組的開首,而數組指針可以先指向數組開首,再指向其他元素。
更改下面的代碼,借助自增運算符來遍歷數組元素:
#include <stdio.h> int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int i, *p = arr, len = sizeof(arr) / sizeof(int); for(i=0; i<len; i++){ printf("%d ", *p++ ); } printf("\n"); return 0; }
運轉成果:
99 15 100 888 252
第 8 行代碼中,*p++ 應當懂得為 *(p++),每次輪回都邑轉變 p 的值(p++ 使得 p 本身的值增長),以使 p 指向下一個數組元素。該語句不克不及寫為 *arr++,由於 arr 是常量,而 arr++ 會轉變它的值,這明顯是毛病的。
關於數組指針的謎題
假定 p 是指向數組 arr 中第 n 個元素的指針,那末 *p++、*++p、(*p)++ 分離是甚麼意思呢?
*p++ 等價於 *(p++),表現先獲得第 n 個元素的值,再將 p 指向下一個元素,下面曾經停止了具體講授。
*++p 等價於 *(++p),會先輩行 ++p 運算,使得 p 的值增長,指向下一個元素,全體上相當於 *(p+1),所以會取得第 n+1 個數組元素的值。
(*p)++ 就異常簡略了,會先獲得第 n 個元素的值,再對該元素的值加 1。假定 p 指向第 0 個元素,而且第 0 個元素的值為 99,履行完該語句後,第 0 個元素的值就會變成 100。
以上就對C說話 數組指針的材料整頓,後續持續彌補相干常識,感謝年夜家對本站的支撐!