指標作為引數的常見錯誤

2021-09-11 15:40:22 字數 1855 閱讀 2773

本文章相關知識點:

1.指向指標的指標

2.指標用作函式引數

通過例題來說明:已知姓名用「名字#姓氏」的方式儲存在字串中,

例如「jordan#michael」.

編寫乙個find函式,獲取姓名中名字的長度並獲取姓氏。例如:jordan#michael中名字的長度是6,姓氏為 michael。

首先給出一段錯誤**:

#include int find(char *s, char ch, char *sub)

return 0;

}void main()

在find函式中,通過乙個迴圈掃瞄字串中的字元, 當發現#分隔符時,將分隔符後面首位址賦值給引數sub並返回分隔符前面字元的個數。這樣看來程式似乎沒什麼問題,但是程式編譯後,編譯器卻顯示givenname是未定義的。那麼問題出在**呢?

這裡通過如下分析來解釋原因:

在呼叫find函式前,指標givenname沒有初始化,隨機指向乙個位址空間;呼叫find函式時,將givenname作為引數傳遞給find函式的形參sub,sub也指向了這個隨機的位址;在find函式中,將分隔符後面首字母的位址賦值給sub,sub的值發生了變化,指向字串中的字元m,此時givenname並沒有變化,任然指向原來的空間;函式呼叫結束後,givenname仍舊沒有被初始化和賦值。

因此find函式中修改指標find並不會影響主調函式中的指標givenname。如果想通過指標在指標在被調函式中修改主調函式的變數,必須將主調函式變數的位址作為引數,在被調函式中修改指標指向的內容

注意(指標傳遞的誤區):通過指標傳遞引數時,最大的忌諱就是以為

只要引數是指標就萬事大吉了。實際上,應該首先確定要修改的變數的型別,然後在將其位址作為引數。如果要修改的變數本身就是指標,就應該將該指標的位址作為引數,此時的形參型別是指向指標的指標。

要想在find函式中修改givenname的值,就得將givenname的位址&givenname作為引數傳遞給find函式。由於givenname本身就是指標,因此在find函式的引數中應該使用指向指標的指標char **sub。修改後find函式的宣告和呼叫如下:

int find(char s, char ch, char **psub);

int cnt = find(fullname, 『#』, &givenname);

將需要修改的變數的位址作為引數,也就是將givenname的位址&givenname作為引數;

在被調函式中修改指標指向的內容,被調函式中的指標是psub,指標指向的內容是 psub, 在被調函式中對psub進行賦值,就相當於修改了主調函式的變數givenname。

下圖描述了修改後指標的變化:

在呼叫find函式之前,givenname指向乙個隨機的位址空間;呼叫find函式時,將givenname的位址作為引數傳遞給find函式的形參psub,使psub指向givenname;在find函式中,修改指標psub指向的內容psub,就相當於修改了主調函式中的givenname,使得givenname指向字元m;函式呼叫結束後,givenname指向字元m。

修改後的程式:

#include int find(char *s, char ch, char **psub)

} return 0;

}void main()

指標作為引數

值傳遞,指標傳遞?這幾天在學習c過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解 源 如下 createnode binnode tree,char p 該 段的意圖是通過乙個函式建立乙個二叉樹的節點,然而在,呼叫該函式後,試圖訪問該節點結構體的成員時候,卻發生了記憶體訪問錯誤...

指標作為函式的引數

一 呼叫getptr後ptr仍然為null程式出錯 include include void getptr char p,int num int main 二 修改程式 include void getptr char p,int num int main 解釋 首先要說明的是char ptr,開始...

指標作為函式的引數

各位小夥伴學習了指標之後是不是跟我一樣,一臉矇逼這玩意在講啥,我也是經過了很長時間的思考才勉強懂了指標的意思。指標其實就是一種變數,只是它與普通變數不太一樣,普通變數存放的是乙個實實在在的值,而它存放的卻是乙個值的位址。計算機要對資料進行處理是需要知道這個資料它在 的,也就是這個資料的位址。而我們平...