二維陣列與二級指標

2021-05-25 10:50:13 字數 1730 閱讀 5276

今日在論壇上看到有人問到指標

級指標和二維陣列

我們知道char array=」abcdef」; array是陣列的首位址,

那麼在二維陣列中array當然也是陣列的首位址,

看看這個定義char array[3] =;

怎麼知道的呢?定義這樣乙個陣列,在vc除錯視窗中

我們看到:

array ---------0x64324234

|------array[0]---0x64324234 「ab「

|------array[1]---0x64324337 「cd「

|------array[2]---0x6432433a 「ef」

已經很明白了,實際編譯器是這樣實現二維陣列的,實際上array是「一維

對應乙個字串

char **parray = array;編譯器

的值是相等的,但我們是否可以象使用array[i]那樣來同樣輸出字串呢?很明顯是不行的,編譯器不會把

parray+i處理成parray+i*3尋找到第i個指標的位址,而只是簡單的加了乙個i.這說明編譯器只做了很簡單的將位址值賦給

了parray,而它實際沒有任何意義.我們不能用它來訪問任何資料.很奇怪嗎?

再來就可以使用sp[i]來訪問字串了呢,的確編譯器在編譯的時候識別出了sp是乙個指向一維陣列的指標的

指標,那麼我們就可以把它做為陣列名來操縱整個陣列了,c神奇的地方或者說精華的地方就在這裡了,希望

這篇文章對那些對指標或二級指標有疑惑的朋友能夠有所幫助,這也是我blog裡的第一篇文章,呵呵.

附:採用指向指標的指標操作,一般用於在函式內部來改變採用指標方式傳進函式的主函式的指什的指向  

我們想在函式pro()中改變指標p的值(記住:是指標p的值,而不是p所指向的位址的值)。能實現嗎?結果是不能,為什麼?我們來分析一下  

先看乙個例子:  

#include  

char   buf[10]   =   "hello";  

void   pro(char   *out)  

void main()  

我們想在函式pro()中改變指標p的值(記住:是指標p的值,而不是p所指向的位址的值)。能實現嗎?結果是不能,為什麼?我們來分析一下。  

如果不用函式pro(),我們可以直接在主函式中用   p   =   buf   來實現。如果使用函式pro(),就變得稍微複雜了。因為我們要在函式pro()中改變指標p的值,而函式pro()又沒有返回值,如何記住這個改變呢?  

我們可以先用簡單的例子說明:  

#include  

void   pro(char   *out)  

void main()  

(注: 這個程式是錯誤的!!!  

p指向的是存放在常數區的字串"hello";   

在函式pro卻要去改寫這個字串,雖然編譯能通過,但是是錯誤的 !!)  

這個例子是改變了字串指標p所指向的字串的指,它能記住這個改變是因為在函式中是對指標所指向的位址空間進行操作。你明白了嗎?也就是說,函式的引數是char   *out,我們可以改變   *out,但改變不了out本身。  

所以針對第乙個例子,我們要想改變p,必須把&p當作引數傳給函式pro()。修改後的例子如下:  

#include  

char   buf[10]   =   "hello";  

void   pro(char   **out)  

main()  

二級指標與二維陣列

include 輸入輸出標頭檔案。include 本程式需要用到malloc free函式,引用該標頭檔案。int main 定義二維陣列a,並賦值從1 12.int p null 定義二維指標。int i,j p int malloc sizeof int 3 要訪問的陣列有三行,所以申請三個一維...

二維陣列與二級指標

首先,記憶體是連續的,二維陣列中的資料塊在記憶體中也是一塊連續的順序的儲存的空間。二維陣列名相當於指標,但是它指向的是乙個陣列型別。int a 4 5 那麼二維陣列a 在記憶體中的分配應該是順序分配 5 5 5 5 此處 5 表示乙個長度為5的一維陣列 二維陣列名 a 指向一維陣列a 0 a相當於乙...

二維陣列 指標陣列 陣列指標 二級指標

include 指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an array,即指向陣列的指標 int a 4 指標陣列 表示 陣列a中的元素都為int型指標 優先順序高於 元素表示 a i int a 4 陣列指標...