二級指標的妙用

2021-04-08 16:24:50 字數 1042 閱讀 2938

如果我們想在另外的乙個程式中改變某個指標的值,則必須勇二級指標實現.其實指標作為函式的引數時,只需要遵循乙個原則就可以.即:一定要傳遞你要操作的物件的位址.

void getmemory(char *p, int num)

int main(int argc, char **argv)

我用下面這個簡單的圖示來表示記憶體:

因為我們想動態申請空間,並把申請的空間的位址賦值給主程式中的指標變數,主程式必須傳遞該指標的位址(即二級指標).之所以要如此,是由於c語言引數的傳遞是按值的.即形參是乙個臨時變數,我們不能通過改變形參的值達到改變實參的值的目的.這其實跟我們在c語言課中強調的傳值還是傳指標是乙個道理.

讓我們來分析一下上面的程式.在子程式中,我們想改變的是主程式中指標的值,也就是100(假設是這樣)處的記憶體位址中的值.那麼,我們在子程式中就應該操作的是位址100.子程式中我們的指標變數p假設在記憶體的150處,則150處的值是主程式中的str指標的位址100.也就是p=100. 而*p = ?就是直接改變100處的值.看明白了沒有!

也許你會說,如果形參宣告為char * p, *p不也是直接操作位址為100處的值嗎?這個問題問的非常的好,剛開始我也不是很明白,總覺得是一樣的道理.但是當我在除錯上面的程式時才使我恍然大悟,原來如此. 哈哈!

從數字上來說,他們的確是一樣的,但是他們的型別不一樣啊.

char *p;   //*p的型別為字串,當然p的值也是100

*p = (char *) malloc(num);

這種情況編譯都不會通過,左右型別不匹配.

char **p; //*p型別仍然是指標

*p = (char *) malloc(num);

左右都是指標型別,這才是正確的

為了在子程式中實現修改指標本身的值,對形參*一次之後必須仍為指標變數.所以需要用二級指標.

幾級指標其實不是問題的關鍵,重點是型別匹配問題.型別將告訴編譯器該型別所佔據的位元組數.

通過上面的例子我們可以看出,只要你能將100處的四個位元組(linux下指標的大小為4個位元組)的值改為新分配的空間的起始位址,你想用幾級指標就用幾級指標.

指標與二級指標

int num 10 int p1 int p2 p1 指標的指向結構如下圖所示 0x4000 0x3000 p2 0x2000 p1 num p2 表示的是儲存p2指標的位址 p2 表示的是p2指向的位址,即指標p1存放的位址 p2 表示指標p2指向位址中所存的值,即指標p1指向的位址,即變數nu...

二級指標,指向指標的指標

test 函式的語句getmemory str,200 並沒有使str 獲得期望的記憶體,str 依舊是null,為什麼?指標傳遞 void getmemory char p,int num void test void 解釋 毛病出在函式getmemory 中,編譯器總是要為函式的每個引數製作臨時...

二級指標,指向指標的指標

我們先來看乙個例子 假設我們有第三個變數時 c b c的型別顯然是乙個指標,變數b是乙個 指向整形的指標 所以任何指向b的型別必須是指向 指向的指標 的指標,更通俗的來講就是指標的指標。它合法嗎?指標變數和其他變數一樣,佔據記憶體中某個特定的位置,所以用 操作符取得他的位址是合法的。這個變數宣告為 ...