設計乙個函式:
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...