陣列和指標

2021-06-21 02:56:06 字數 2359 閱讀 9841

陣列和指標:

(一)一維陣列和指標

int a[2] = ;

int *p;

p = a

首先 p 指向 a,因為陣列的名字就是指標,而且型別是 int 所以這裡簡單的匹配了。

那麼*p == a[0] == 0x12345678

*(p+1) = a[1] = 90;

注意指標位址加一這個操作,關鍵是看指標的型別,現在這裡指標既然是指向了int陣列

那麼裡面元素的型別也應該是 int,所以 p+1 這個操作應該是移動了乙個 int 。

於是一種比較常用的處理手段出現了。

a[0] 元素是 int 型,4個位元組,那麼我怎麼訪問裡面的每乙個位元組呢?

那麼可以通過

*((char *)p + 1)

這裡有兩個括號,優先順序規則當然是裡面的括號最優先,首先將 p 的型別是 int * 強制

轉換為 char * ,那麼現在型別邊了, p+1 訪問的應該是原來的指標位址移動乙個位元組!

注意是位元組。

0x12345678 這個數字,應該指向 0x56 ,因為pc是little endian小端格式,低位元組先存放

得到的結果就能很好的解釋了。

(二)二維陣列和指標

(1)位址代表的意義

首先理解,二維陣列,例如

int arry[2][3]=,};

這樣寫是最好理解的,也就是說2行3列。其中也可以看成是2個一維陣列的整合,也就是

arry[0] = ;

arry[1] = ;

簡單測試一下一些符號究竟代表的是什麼意思

printf("\n%x",arry);

printf("\n%x",arry[0]);

printf("\n%x",&arry[0][0]);

printf("\n%x",arry+1);

printf("\n%x",arry[1]+1);

printf("\n%x",&arry[1][1]+1);

從編譯執行的結果來看

12ff68

12ff68

12ff68

12ff74

12ff78

12ff7c

arry 是這個陣列的名字,也就是代表著入口位址,剛才說了,二維陣列實際可以看成n個

一維陣列,例如本例中,arry[0] 代表著其中的第乙個一維陣列,那麼 arry[1] 就代表著

第二個一維陣列,而且這裡是位址,注意 arry[0] 本身就代表著位址了。

arry[0][0]本身代表著這個元素,那麼取位址之後 &arry[0][0] 就變成了,這個元素的位址

然而將每個位址加一後發現,這些位址代表的語義並不相同。

arry+1 之後位址變成 12ff68 到 12ff74 也就是說,指向了 第二行第乙個元素 23

arry[1]本身就代表著第二個一維陣列的入口位址,加一之後就只想這個陣列的第二個元素

那麼就應該指向 45,從位址可以看出。

&arry[1][1]+1 這個是以元素為單位,首先 arry[1][1]這個元素為基準,也就是 45 ,然後

再後移乙個元素,所以應該指向 6.參考

(2)二維陣列怎麼傳遞引數

void disparry(int a[2][3])

void main(void),};

int (*c)[3]=arry;

int *p;

p =(int *)arry;

disparry((int (*)[3])p);

disparry(c); }

可以通過兩種辦法,第一是通過 int * 型別的指標 *p 來處理。首先因為 p 是 int* 型別,

而 arry是二維陣列,不等價不能直接賦值,那麼就簡單的將二維陣列指標轉換為 int* 型別

這樣就匹配了,產生的效果是 p 指向了 arry 的入口。

然後 disparry 函式需要的引數的型別是 int a[2][3],很顯然,這個時候 p又不能作為引數

了,當然直接傳遞的話,執行結果不錯,但是會有 warning 的。於是再一次將 int * 轉換為

需要的 int (*)[3] 型別,說白了,就是 陣列指標。

那麼第二種辦法就很乾脆,定義乙個陣列指標c指向 arry,那麼 c就可以直接傳遞了。

(3)使用 typedef 定義二維陣列

typedef int a[2];

a b[3]=;

printf("\n%d",b[1][0]);

可以看出,先定義一種新的資料型別 a,他是乙個 2個元素的一維陣列。然後再定義乙個含有

3個 a 型別的一維陣列b,這樣b其實就是乙個二維陣列了,b[3]代表的是有3行這樣的一維陣列

所以這樣下來實際上等效於 b[3][2]。

陣列指標和指標陣列

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...

陣列指標和指標陣列

一 定義 陣列指標 陣列指標 是指向陣列 首元素的位址的 指標,其本質為指標 這個指標存放的是陣列首位址的位址,相當於2級指標,這個指標不可移動 指標陣列 陣列元素為指標的陣列,其本質為陣列。二 舉例 int a 3 4 這個無需多說,就是乙個 二維陣列 int p 4 就相當於int p 4 它就...

陣列指標和指標陣列

這兩個名字不同當然所代表的意思也就不同。我剛開始看到這就嚇到了,主要是中文太博大精深了,整這樣的簡稱太專業了,把人都繞暈了。從英文解釋或中文全稱看就比較容易理解。指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an ar...