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 該 段的意圖是通過乙個函式建立乙個二叉樹的節點,然而在,呼叫該函式後,試圖訪問該節點結構體的成員時候,卻發生了記憶體訪問錯誤...
指標作為函式引數傳遞
任何程式語言的引數傳遞實際上都是在做傳值呼叫.所謂的傳指標,就是把指標指向者的位址 乙個值 傳進函式.也就是那個位址被壓棧.然後我們再通過這個位址進行操作,因為實參和形參同樣都是乙個位址的值.所以改變形參指向者的狀態時,實參指標也能看到這種變化.這裡區分一下靜態記憶體,棧記憶體和動態分配的記憶體 堆...