C語言指標作為函式引數傳遞學習 一

2021-09-02 07:32:17 字數 2139 閱讀 8560

傳入的指標為null

比如下面的例子,很多人都會理解錯:

#include void test(char *string)

int main()

是不是覺得輸出應該是:str=hello world.事實上並不是

輸出結果是(作業系統:win10):

具體過程如下:

開始str指標指向null,並將該位址作為形參傳入函式test(),最開始string指標也是指向null,接著講「hello world」位址傳給了string,此時string的指標不再指向null,而是指向「hello world」這個字串的位址。為了驗證這個,可以在**裡加一些列印資訊驗證:

#include void test(char *string)

int main()

2.1 返回string指標,這個很好理解

#include char *test(char *string)

int main()

結果:

2.2 用二維指標

#include void test(char **string)

int main()

結果:

具體分析如下圖:

過程:1.定義乙個字串指標str,str本身的位址是100,值為0(即null,一般的編譯器null的位址是0)。

2.取str的位址100傳給string,此時string的值是100,位址為200

3.這裡假設「hello world」字串的位址是300,接下來就是改變一級指標指向的內容的位址,由0變成300。

#include #include void test(char *string)

int main(void)

結果(因為用的是64位系統,所以位址是8位,這裡位址顯示的6位,因為前面兩位是0,所以預設省略了):

形參都是值傳遞。但是這個值如果是指標的話,是可以改變指標指向內容的值,即實參的值。這個要弄清兩個概念:指標和指標指向的資料。

這個例子中形參的值是實參的位址,並不是實參的值,所以形參的值的改變只是指標的改變,即指向資料的位址改變,並不是指標指向資料的改變。所以我們發現在main函式中,str的值沒有改變。

我們先再看乙個例子:

#include #include void test(char *string)

int main(void)

結果:

編譯沒有任何問題。但是執行卻崩潰了,為什麼呢?

這個又是乙個需要注意的點:指標指向的常量儲存區是不允許修改的,這個實參和形參的位址都是指向字串的位址,是const型別的,所以不能修改。

原來的程式稍作修改:

#include #include void test(char *string)

int main(void)

結果:

我們可以看到,位址沒有改變,但是內容已經被修改了。

總結:形參都是值傳遞

1.這個值是指標的話,在被呼叫的函式(test)中,如果指標的值,不會改變實參的值。

2.如果改變指標指向的內容時,會改變實參的值。

注意:在傳遞的過程中如果是const型別的指標是不允許修改的。

指標作為函式引數傳遞

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

指標作為函式引數傳遞

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

指標作為函式引數,C語言指標作為函式引數詳解

include void swap int a,int b 函式宣告 intmain void void swap int a,int b 大家想一下,執行這個程式是否能互換 i 和 j 的值?不能!i 還是3,j 還是5。因為實參和形參之間的傳遞是單向的,只能由實參向形參傳遞。被調函式呼叫完之後系...