理解陣列與指標

2022-06-06 10:51:08 字數 1579 閱讀 8594

int a[10];

a本身是陣列名也是指向第乙個陣列元素的指標。a+1是指向第二個陣列元素的指標。也就是說a這個指標的值就是&a[0]。

&a這個指標和a都指向同乙個記憶體位址,但是&a這個指標的意義卻是指向整個陣列,&a+1指向a這個陣列結束後的位置。

宣告乙個指標指向來指向這個陣列可以這樣宣告 int *p = a 。而如果要宣告能指向整個陣列空間大小的指標,需要這樣宣告 int (* p) [10] = &a(二維陣列中用這種指標來指向每個子陣列,三維陣列就是 int(*p)[10][10],可依次類推到多位陣列);

int b[10][10];

b是二維陣列,可以看成是一維陣列的陣列。b指標指向第乙個一維陣列,和b[0]指向的位址相同,也和b[0][0]的位址相同,也就是&b[0][0]。但是代表的意義不同,*b=b[0],*b[0]=b[0][0],也就是**b=b[0][0]。

&b是指向整個二維陣列的指標,&b+1指向整個二維陣列結束後的位置。

b是指向二維陣列的第乙個陣列元素的指標,b+1是指向二維陣列的第二個陣列元素的指標。

b[0]是指向二維陣列第乙個陣列元素的第乙個元素的指標,b[0]+1是指向二維陣列第乙個陣列元素的第二個元素的指標。

在函式形參中int (*p) [10]和int p [10]等價,都是指向乙個長度為10的int陣列的指標,注意如果用指標形式則不能省掉(),因為符號優先順序大於*,如果去掉()寫成int * p [10]則是定義乙個包含10個int型別指標的陣列。如 char * p [3] = ,這裡p是乙個指標陣列,儲存3個字串常量的位址。可見,如果用字串陣列(就是二維字元陣列)來儲存這些內容的話要定義為char p[3][6] = 才能裝得下,明顯比指標陣列的方式效率低,所以如果不是要修改字串的值得情況下應優先考慮指標陣列的形式。

陣列傳遞給函式是傳遞陣列的指標,如果不希望在函式中對陣列做修改的話,最好將形參定義為const來保證原陣列不被修改,func(const int * ar)。如果是定義乙個指標只指向乙個陣列而不能被改指他處則要這樣 int * const ar = a。

定義乙個字串可以用下面三種方式:

#define str "hello"

const char s[10] = "hello";

const char s = "hello"; //這樣可以自動計算需要的元素個數

const char * sp = "hello";

這裡如果不用const,則s定義的字串可以修改內容,但是*sp這種是不可修改內容的,因為*sp是直接指向字串常量的指標,而s是在記憶體中重新分配的空間,將字串常量的值新增進來。這點可以通過比較定義的字元陣列和字串常量的位址來驗證(我目前使用的clang編譯器對出現多次的相同字串常量是儲存在同乙個位置的,而且儲存靜態資料和動態資料的位址位數都不同。可能有其他編譯器會儲存在不同位置)。

另外,s這種形式定義的陣列,s是常量,本身只能指向陣列的首位址,可以用s+1來指向下乙個元素位址,但是不可以改變s本身儲存的位址值,如++s或s++都不行。*sp中sp是變數,定義時儲存的是字串常量的首位址,sp+1指向陣列的第二個元素,但是可以對sp內儲存的內容做修改,如++sp,sp++都可以。兩者在使用時也都可以使用s[1]和*(s+1)這兩種方法來取陣列元素的值。

深入理解陣列指標與指標陣列的區別

陣列指標與指標陣列的區別在於 陣列指標p是乙個指標,而指標陣列p是乙個存放n個指標變數的陣列。一 陣列指標 int p n 重點 優先順序高 的優先順序是一樣的,但它們的方向是從左至右的,所以先執行括號裡的 p 首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長...

呼叫二維陣列來理解陣列指標與指標陣列

二維陣列 二維陣列可以看作是乙個一維陣列,在本質上是以陣列為陣列元素的陣列。從記憶體空間上看,int a 2 5 和int a 10 同樣占用連續的10個int型空間。陣列指標 一般短語前面做修飾,後面為名詞。陣列指標,顧名思義本質上是一種指標,用於指向陣列的首元素首位址,即叫陣列指標。定義的方法為...

理解陣列與指標不可缺少的東西

作為c語言的特色,也可以說是精華,指標實質名歸!另一大組成部分 陣列,總是和指標糅合在一起操作記憶體,不得不提的是c語言的難點就是記憶體管理,而與記憶體關係最為密切就是陣列和指標,導致初學者學習起來很困難,並且在產生錯誤的時候很難發現錯誤並改正,需要耐心的除錯和檢視變數的值。基於這一點,以下就是本人...