為什麼使用二級指標

2021-06-05 10:43:43 字數 1198 閱讀 1155

設計乙個函式:

void find1(char array, char search, char *pa)

要求: 這個函式引數中的陣列array是以\0值為結束的字串,要求在字串array中查詢與引數search給出的字元相同的字元。如果找到,通過第三個引數(pa)返回array字串中首先碰到的字元的位址。如果沒有找到,則為pa為null。

依題意,實現**如下。

void find1(char  array, char search, char *pa)

}}

這個函式實現能實現所要求的功能嗎?

下面呼叫這個函式試試

int main(int argc, char *argv)

else

return 0;

}

執行結果是not found!        why?!

分析:  先看函式定義處:

void find1(char  array, char search, char *pa)

再看呼叫處:

find1(str, a, p);

仔細考慮此時形參結合所發生的事:array得到了陣列名為str, search得到了a的值, pa得到了p的值(是null,而非p自身的位址)!但實參p並未得到形參pa傳回的值(某元素的位址)。可見儘管使用了指標,也並沒實現傳址,當實參形參都是指標時,它們也僅僅是傳值——傳了別人的位址,沒有傳回來。

修正:

void find2(char  array, char search, char **ppa)

}if ('\0' == *(array + i))

}

主函式的呼叫處改如下:

find2(str, a, &p);    // 呼叫函式以實現操作

ppa是指向指標p的指標。

對*ppa的修改就是對指標p的修改。

注意: 不要將指標的用法照搬到指向指標的指標頭上!

如:char *pa 和 const char *pa是型別相容的;

但char **pa 和 const char **pa則型別不相容!

為什麼要用二級指標

在重新回顧c語言資料結構時,在實現順序表和煉表時關於指標使用的區別讓我覺得很有趣 像在順序表中實現 struct seqlist 而我們在使用順序表時,往往在main函式中直接定義 seqlist seqlist 在後面對順序表的使用中,直接傳參,比如 initlist seqlist 而在鍊錶中 ...

為什麼一定要使用二級指標,而一級為什麼就不行呢??

為什麼一定要使用二級指標,而一級為什麼就不行呢?不是說函式中傳遞指標,在函式中改變指標的值,就是在改變 實參中的資料資訊嘛?額。其實吧,上邊說的也對,可問題就在這塊了。問題是,在建立二叉樹的過程中,不是改變了形參的值,而是 改變了形參的指向 而推出該函式後,形參被釋放了,那麼為形參動態分配的空間,也...

二級指標使用舉例

一 無法把指標變數本身傳遞給乙個函式 函式實參接收的實際是乙個指標變數 p 的複製,如p copy,而非指標變數本事,通過p copy可以改變p指向的變數的值,而不能改變p本身的值。eg 參考c語言深度解析4.6.2.2 include include void getmemory char p,i...