c 指標與函式引數傳遞 小結

2021-06-28 06:32:30 字數 1956 閱讀 2829

1.函式引數傳遞的語義與初始化的語義完全一致,即可以將引數傳遞理解為乙個初始化的等式

2.指標變數儲存的是所指物件的位址,稱為指標變數的值。

3.當用乙個指標a初始化指標b時,指標b儲存的是指標a所指物件的位址。

char *a = new char(10);

char *b = a;

由於指標變數a,b指向同乙個物件,那麼它們都能改變所指物件的值。

a[0] = 'a';

b[0] = 'b';

cout<

但是如果改變指標變數的值,也就改變指標所指的物件。那麼a,b就沒有聯絡。

a[0] = 'a';

b[0] = 'b';

a = "hello";

cout<

4.從指標變數的宣告,如何知道該指標儲存的是何種變數的位址?

(在c++ primer中有詳細描述,從右往左閱讀,變數名 是 乙個指標,指向某變數---該變數的描述繼續遞迴運用以上規則)

char*   a;//儲存乙個字元變數的位址

char** a;//儲存乙個指向字元變數的指標所在的位址

5.我的乙個思維誤區:混淆實參與形參。

形式引數是指在函式被呼叫時生成的臨時變數,作用域在這個函式體內。

指標作為形式引數時,可以修改函式體的變數的值,但是該指標變數本身依然只是函式體作用域內的區域性變數。

形參與實參的正確關係應當理解為:使用實參來初始化形參

6.當指標作為引數時,試圖用指針對實參變數進行修改。

(1)需要想明白指標所指的物件是誰?

(2)想要修改實參變數,就要傳遞實參變數的位址,形參應當是指向實參變數的指標。

例子://字串拼接

int main()

{ char *str1 = "hello";

char *str2 = "world";

char *str3 = 0;//沒有給str3賦值

cat(str1,str2,str3);

cout《在上面的例子中,我試圖將str1和str2拼接成str3.

我的想法是將str3傳入cat函式,然後在函式內給str3申請大小適當的空間,然後改變str3所指向位址的值。

然而這個想法不夠仔細,是我錯誤的根源。我沒想明白,究竟是將str3的什麼傳入函式中?str3的位址,還是str3所指的物件。

在上面的**中,我只是將str3所指的物件傳遞給了函式呼叫時生成的臨時變數,也就是是臨時變數和str3指向了同乙個位址,然後在函式體內改變這個臨時變數的值,從此和外部的str3指向不同的位址。

當然,如果這個臨時變數不更換位址,使用它確實可以改變str3所指物件的值,但是它不能改變str3的值。(因此可以現在函式外部分配適當空間,在傳遞str3所指的物件,那麼程式便可以正確。)

所以,根據我的想法,對於cat的第三個引數,應當傳入str3的位址,使得在函式內部可以改變str3的值。

因為str3是 char* 的變數,所以形參str的型別應當是 char** 。

正確的函式為:  

void cat(char* str1,char* str2,char** str3)

傳遞引數時,應當傳遞str3的位址,即&str3 。

等價的初始化式:

char**  str =&(str3)

在函式內部使用  *str 就可以獲取str3的位址了。

7.總結

指標是用來操作變數的值的工具。指標變數自身的值就是所指物件的位址。

涉及到指標變數的時候,應當想清楚到底想要利用該指標變數操縱什麼,指標應當指向什麼。



C 函式傳遞引用指標引數問題

僅作為參考 記錄 函式如果直接傳遞指標,如呼叫init linklist l l的初始指向為null,對l進行賦值,l指標不在指向null,而是指向new linklist 後的位址,但是無法對傳入的實參進行修改,l仍然指向null 這裡指標的傳遞仍然為值傳遞 初始化鍊錶 status init l...

指標作為函式引數傳遞

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

指標作為函式引數傳遞

任何程式語言的引數傳遞實際上都是在做傳值呼叫.所謂的傳指標,就是把指標指向者的位址 乙個值 傳進函式.也就是那個位址被壓棧.然後我們再通過這個位址進行操作,因為實參和形參同樣都是乙個位址的值.所以改變形參指向者的狀態時,實參指標也能看到這種變化.這裡區分一下靜態記憶體,棧記憶體和動態分配的記憶體 堆...